前前后后学链表快三次了,比较难理解。
分享一下我自己的链表构建和 *** 作。
写的只能说是比较详细吧,理解指针后和结构体后链表就很好理解了
链表其实是一种数据结构,通俗来讲就是如何存储数据。
链表由节点构成,每个节点都是一个结构体。
每个节点中存储数据和指针,指针指向下一个节点(结构体),所以说节点中的指针是结构体指针
链表节点在内存种的存储是不连续的
基础单向链表
删除节点,添加节点对应这个图想象怎么 *** 作
#include#include #define CREAT (stu*)malloc(sizeof(stu)) #define menu printf("1.尾插法创建链表n 2.头插法创建链表n 3.添加一个节点n 4.删除一个节点n 5.打印链表n 6.查找链表中某个节点的值n") typedef struct student { int number; char name[10]; struct student *next; }stu; //函数功能:尾插法创建链表 //传递参数:链表的长度(int) //返回值:头节点(stu*) stu *end_creatlink(int n) { printf("请输入链表节点中的值"); stu *head,*node,*end; head=CREAT; end=head; //尾节点和头节点指向一块空间,便于以后 *** 作 //加入不用end=head 那么第一次新建节点用头节点指向,但是其他新建节点却用尾节点指向,要加判断条件 for(int i=0;i number); end->next=node; //尾节点的下一个节点是新建节点 end=node; //新建节点成为尾节点 } end->next=NULL; //建表完毕,尾节点指向NULL return head; } //函数功能:头插法创建链表 //传递参数:链表的长度(int) //返回值:头节点(stu*) stu *head_creatlink(int n) { printf("请输入链表节点中的值"); stu *head,*node; head=CREAT; head->next=NULL; //同32行道理一样 for(int i=0;i number); node->next=head->next; //新建节点的下一个节点是头节点的下一个节点 head->next=node; //头节点的下一个节点指向新建节点 } return head; } //函数功能:打印链表节点中的数据 //传递参数:链表的头节点(stu*) //返回值:无 void print(stu *link) { link=link->next; //头节点的下一个节点,也就是第一个节点 //因为尾节点的指针是一个空指针,所以当link=NULL时,链表就结束了 while(link!=NULL) //如果这个节点不是空指针就执行输出 *** 作 { printf("%d ",link->number); link=link->next; } printf("n"); } //函数功能:在第p个节点后添加一个节点 //传递参数:链表的头节点(stu*),p(int) //返回值:无 void addlink(stu *link,int p) { for(int i=0;i next; //找到对应的节点 } stu *node=CREAT; printf("请输入想要添加的数值"); scanf("%d",&node->number); node->next=link->next; //新建节点的下一个节点是当前节点的下个节点 link->next=node; //当前节点指向新建节点 } //函数功能:删除第p个节点后的节点 //传递参数:链表头节点(stu*),p(int) //返回值:无 void dellink(stu *link,int p) { for(int i=0;i
next; //临时的指针先指向当前节点的下一个节点 if(temp->next==NULL) //如果当前节点的下一个节点的下一个节点为尾节点 { temp->next=NULL; //如果我们要删除的节点是尾节点,要把尾节点的前一个节点变为新的尾节点 return; //直接返回就可以了 } link=link->next; //找到要 *** 作到的位置 } stu *temp=link->next; //临时节点指向当前节点的下一个节点 link->next=temp->next; //当前节点的下一个节点指向当前节点的下一个节点的下一个节点,也就是临时系节点的下一个节点 temp->next=NULL; //临时节点指向空,删除完毕 //还可以用free释放内存,这里不进行 *** 作了 //free(temp); } //函数功能:查找链表节点数据域中是否有数据p //传递参数:头节点(stu*),p(int) //返回值:无 void find(stu *link,int p) //链表和数组不太一样,想要找到数据域中的数据,只能厉遍链表 { int i=0; int flag=0; link=link->next; //第一个节点 while(link!=NULL) //当前节点不是空,执行 *** 作 { if(link->number==p) { flag=1; printf("找到了!!!n"); printf("在第%d个节点后面n",i); } i++; link=link->next; //向下寻找 } if(!flag) printf("没有找到n"); } int main() { int choose=1; stu *head; menu; while(1) { printf("n"); scanf("%d",&choose); switch (choose) { case 0 : { printf("结束!"); return 0; } case 1: { int n; printf("请输入链表长度"); scanf("%d",&n); head=end_creatlink(n); break; } case 2: { int n; printf("请输入链表长度"); scanf("%d",&n); head=head_creatlink(n); break; } case 3: { int p; printf("请输入要插入到第几个节点后面,第0个节点为头节点"); scanf("%d",&p); addlink(head,p); break; } case 4 : { int p; printf("请输入要删除第几个节点后面的节点,第0个节点为头节点");//只能在合法节点后删除,若节点序列大于合法序列删除最后一个,小于合法序列删除第一个 scanf("%d",&p); dellink(head,p); break; } case 5 : { print(head); break; } case 6 : { int p; printf("请输入要查找的数值"); scanf("%d",&p); find(head,p); break; } } } return 0; }
若有BUG欢迎指正!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)