最近在重温数据结构,先从单链表开始,首先系统讲一下单链表的初始化和创建。
一、初始化链表
定义一个结构体表示链表中的每一个结点:
typedef struct node
{
ElemType data;
struct node *next;
}*LinkList,LNode;
初始化操作:
int init_LinkList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(LNode));
if(*L==NULL)
return 0;
(*L)->next=NULL;
return 1;
}
初始化生成一个空结点:
二、创建链表
1、无头结点
(1)头插法(逆序)
LinkList createh_LinkList()
{
LinkList L=NULL;
LinkList p;
int flag=1;
while(flag)
{
p=(LinkList)malloc(sizeof(LNode));
if(p==NULL)
return NULL;
printf("input:\n");
scanf("%d",&p->data);
printf("continue or not,1 or 0:\n");
scanf("%d",&flag);
p->next=L;
L=p;
}
return L;
}
(2)尾插法(正序)
LinkList creater_LinkList()
{
LinkList L=NULL;
LinkList p,r;
int flag=1;
while(flag)
{
p=(LinkList)malloc(sizeof(LNode));
if(p==NULL)
return NULL;
printf("input:\n");
scanf("%d",&p->data);
printf("continue or not,1 or 0:\n");
scanf("%d",&flag);
p->next=NULL;
if(L==NULL) //判断是否为第一个结点
L=p,r=p;
else
r->next=p,r=p;
}
return L;
}
2、有头结点
(1)头插法(逆序)
LinkList createh_LinkList()
{
LinkList L=NULL;
LinkList p;
int flag=1;
if(init_LinkList(&L)==0)
return NULL;
while(flag)
{
p=(LinkList)malloc(sizeof(LNode));
if(p==NULL)
return NULL;
printf("input:\n");
scanf("%d",&p->data);
printf("continue or not,1 or 0:\n");
scanf("%d",&flag);
p->next=L->next;
L->next=p;
}
return L;
}
(2)尾插法(正序)
LinkList creater_LinkList()
{
LinkList L=NULL;
LinkList p,r;
int flag=1;
if(init_LinkList(&L)==0)
return NULL;
r=L;
while(flag)
{
p=(LinkList)malloc(sizeof(LNode));
if(p==NULL)
return NULL;
printf("input:\n");
scanf("%d",&p->data);
printf("continue or not,1 or 0:\n");
scanf("%d",&flag);
p->next=NULL;
r->next=p;
r=p;
}
return L;
}
有头结点的单链表操作简单,但是需要有一个空的结点,没有头结点的单链表节省空间,但是操作起来比较麻烦。