标题:
关于链表的一些知识
[打印本页]
作者:
x86
时间:
2005-11-9 12:27
标题:
关于链表的一些知识
链表可以分为单链表、双链表和循环链表等。我想只要你把单链表搞清楚就不难理解其它链表了。 准备知识:动态内存分配、结构体、指针 在单链表中,把每一个单元看做是一个节点,也就是链表中的一个点,而这个点是由一个结构体类型的数据所组成的,由于内存的物理结构是线性排列的,所以,一个结构体类型的数据其内部的各各成员也是按线性结构排列的。 #include
#include
int main(int argc,char *argv[]) { struct table//定义结构体 { int data;//用来存储数据 char name[20];//用来存储数据 struct table *next;//定义一个结构体类型的指针,记录链表中下一个结点的首地址 }; char select=';y';;//循环条件 struct table *tab,*p,*head;//定义*tab用来生成新的结点,*p为工作指针、*head为头指针、用来记录链表的首地址 tab=(struct table*)malloc(sizeof(struct table));//动态生成第一个结点 tab->next=NULL;//将结点中的*next指针指向空,要不*next是野指针。 head=tab;//将*head指向该结点,以记住链表首地址 p=tab;//将*p工作指针也指向该结点 while(select != ';n';)//进入循环体 { if(tab==NULL)//判断第一个结点是否申请成功 puts("the error!"); else { printf("please input data:");//给结点中的成员赋值 scanf("%d",&tab->data); printf("please input name:"); scanf("%s",&tab->name); tab=(struct table*)malloc(sizeof(struct table));//生成第二个结点 tab->next=NULL;//将新结点的*next指针指向空,原因同上。 p->next=tab;//将第一个结点与第二个结点相连接 p=tab;//移动工作指针到新结点 } while(getchar() !=';\n';);//清空缓冲区,与本程序关系不大 printf("Are you go on?(Y/N):");//判断是否继续循环 select=getchar();//读入循环条件 } //编历整个链表 p=head;//将工作指针指向链表的首部 while(p->next != NULL)//循环终止条件 { printf("%d\t%s\n",p->data,p->name);//输出结点中的数据 p=p->next;//移动工作指针到下一个结点 } free(head);//释放头指针 return 0; } ================================================================================ 以下是一个双向链表的例子,我就不写注释。希望能给你一些帮助。 #include
#include
int main(int argc,char *argv[]) { struct table { int data; char name[20]; struct table *back; struct table *next; }; char select=';y';; struct table *tab,*p,*head; tab=(struct table*)malloc(sizeof(struct table)); tab->next=NULL; tab->back=NULL; head=tab; p=tab; while(select != ';n';) { if(tab==NULL) puts("the error!"); else { printf("please input data:"); scanf("%d",&tab->data); printf("please input name:"); scanf("%s",&tab->name); tab=(struct table*)malloc(sizeof(struct table)); tab->back=p; tab->next=NULL; p->next=tab; p=tab; } while(getchar() !=';\n';); printf("Are you go on?(Y/N):"); select=getchar(); } p=head; printf("************************************\n"); while(p->next != NULL) { printf("\t%d\t%s\n",p->data,p->name); p=p->next; } p=tab; printf("************************************\n"); while(p->back != NULL) { p=p->back; printf("\t%d\t%s\n",p->data,p->name); } printf("************************************\n"); free(head); free(tab); return 0; } ================================================================================
欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/)
Powered by Discuz! 7.2