链表可以分为单链表、双链表和循环链表等。我想只要你把单链表搞清楚就不难理解其它链表了。
准备知识:动态内存分配、结构体、指针
在单链表中,把每一个单元看做是一个节点,也就是链表中的一个点,而这个点是由一个结构体类型的数据所组成的,由于内存的物理结构是线性排列的,所以,一个结构体类型的数据其内部的各各成员也是按线性结构排列的。
#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;
}
================================================================================ |