C语言之双向链表详解及实例代码
1,双向链表简介。
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
2,例子要求:
完成双向链表的插入、删除以及查找,将学生管理系统使用的数组,以双向链表的方式实现,能够支持无限制的学生人数的增删改查以及保存。
3,代码实现。
#include<stdio.h> #include<string.h> #include<stdarg.h> #include<stdlib.h> typedefstructStudent{ charname[20]; intscore; charphoneNum[14]; }str_student; typedefstructNode{ str_studentdata; structNode*prior;//指向前驱结点 structNode*next;//指向后继结点 }Node,*DLinkList; //初始化一个学生链表 DLinkListinitDouLinkList() { Node*L,*p,*r; charname[20]; charphone[14]; intscore; L=(Node*)malloc(sizeof(Node)); L->next=NULL; r=L; r->next=NULL; while(1) { p=(Node*)malloc(sizeof(Node)); printf("inputnameisoutexit,inputstudentname:\n"); scanf("%s",name); if(strcmp(name,"out")==0) { break; } strcpy(p->data.name,name); printf("inputstudentscore:"); scanf("%d",&score); p->data.score=score; printf("inputstudentphone:"); scanf("%s",phone); strcpy(p->data.phoneNum,phone); p->next=r->next; r->next=p; r=p; } r->next=NULL; returnL; } //添加学生信息 DLinkListinsertDouLinkListStuent(DLinkListL,inti,char*name,intscore,char*phonenum) { DLinkListp,s; p=L->next; inttempi; for(tempi=1;tempi<i-1;tempi++) p=p->next; s=(Node*)malloc(sizeof(Node)); s->data.score=score; strcpy(s->data.name,name); strcpy(s->data.phoneNum,phonenum); s->next=p->next; p->next->prior=s; s->prior=p; p->next=s; returnL; } //查找学生信息 intfindDouLinkListStudent(DLinkListL,char*name) { DLinkListp; p=L->next; inti=1; while(p!=NULL&&(strcmp(p->data.name,name)!=0)) { ++i; p=p->next; } if(p==NULL) return0; elsereturni; } //移除一个学生 DLinkListremoveDouLinkListStudent(DLinkListL,char*name) { inttempi=1; DLinkListp; p=L->next; inti=findDouLinkListStudent(L,name); while((tempi++)!=i&&p!=NULL) { p=p->next; } if(p==NULL) printf("nolist\n"); elseif(p->next==NULL) { p->prior->next=NULL; free(p); } else { p->prior->next=p->next; p->next->prior=p->prior; free(p); } returnL; } //铺助打印信息 voidprintfInfo(DLinkListL) { DLinkListp; p=L->next; while(p!=NULL) { printf("studentname%s\n",p->data.name); printf("studentname%d\n",p->data.score); printf("studentname%s\n",p->data.phoneNum); p=p->next; } } voidmain() { charname2[20]="hanmeimei"; charphone2[14]="13612345678"; DLinkListL=initDouLinkList(); //2.1初始化学生双向链表数据 insertDouLinkListStuent(L,1,name2,99,phone2); printfInfo(L); //2.2查找学生zhangsan findDouLinkListStudent(L,'zhangsan'); printfInfo(L); //2.3删除学生zhangsan removeDouLinkListStudent(L,'zhangsan'); printfInfo(L); //2.4添加学生zengteng insertDouLinkListStuent(L,9,'zengteng',89,'13643345667'); printfInfo(L); }
以上就是对C语言双向链表的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!