单链表的基本操作
/#include <stdio.h>
/#include <stdlib.h>
/#include <malloc.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
//初始化一个链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
if(L==NULL)
return false;
L->next = NULL;
return true;
}
//头插法录入数据 需要设置一个指针r始终指向最后一个元素。
LinkList List_TailInsert(LinkList &L){
int x,j;//x用来保存输入数据的数量
L = (LNode *)malloc(sizeof(LNode));
LNode s,r=L;//s为新节点
printf("请输入你要输入数据的数量:
");
scanf("%d",&x);
printf("请输入一组数据:
");
for(int i=0; i<x; i++){
s = (LNode *)malloc(sizeof(LNode));
scanf("%d",&j);//定义一个变量j用来保存每次输入的值
s->data = j;
r->next = s;//使头指针和s节点之间建立连接。
r = s;
}
r->next = NULL;
return L;
}
//输出一个链表
PrintList(LinkList &L){
LNode *p=L->next;//P需要指向L的next
// printf("22
");
// for(p=L->next;p!=NULL;p=p->next)
// printf("%d ",p->data);
while(p!=NULL){ //这个地方是p!=NULL (P的指针域为NULL)
printf("%d
",p->data);
p=p->next;
}
// printf("22
");
}
//按位查找 (第几个位置对应的值)
LinkList FindElemList(LinkList &L,int x){
int j=0;
LNode *p;
p=L;
if(x<0)
return NULL;
while(p!=NULL&&j<x){
p=p->next;
j++;
// printf("%d
",j);
}
// printf("22
");
printf("对应的节点为:");
printf("%d
",p->data);
printf("~~~~~~~~~~~~~~~~~
");
return p;
}
//删除指定位序节点 并返回节点对应的值
bool DeleteList(LinkList &L,int i){
if(i<0)//可以加上链表的长度进行限制 稍后实现
return false;
LNode *s;
int y;
s=L;
for(int j=0; j<i; j++){
s=s->next;
}
printf("%d节点对应的数据为:",i);
printf("%d
",s->data);//此时 s节点即为要删除的节点,
LNode *q;
q = s->next;//用q节点指向s的下一个节点
s->data = q->data;//把q的值赋给s(此时s的值被覆盖,且s保存的是s的下一个节点的值)
s->next = q->next;//此时让s指向q的下一个节点。
free(q); //释放q节点。
}
//求链表的长度
int LenthList(LinkList L){
int j=0;
LNode *s;
s=L->next;
while(s!=NULL){
s=s->next;
j++;
}
printf("链表的长度为:%d
",j);
// return j;
}
int main(){
LinkList L;
InitList(L);//初始化链表
List_TailInsert(L);// 头插法录入数据。
printf("顺序输出:
");
PrintList(L);//输出链表
int x,y,i;
printf("请输入你要查询的位序
");
scanf("%d",&x);
FindElemList(L,x);//查询指定位序对应的元素
printf("请输入你要删除的位序
");
scanf("%d",&y);
DeleteList(L,y);//删除指定位序的数据 !这种删除元素的方法 有缺陷若是删除的元素为最后一个元素则程序出错。
printf("删除后的链表为:
");
PrintList(L);//输出链表
LenthList(L);
return 0;
}