最近又复习了一波链表的知识,秉承着好记性不如烂笔头的道理,适时记录还是很有必要的呀!
我们知道单链表分两种:带头节点和不带头节点的
创建单链表时有两种方法:头插法和尾插法
如此一来,创建单链表便出现了四种情况:不带头节点的头插法,不带头节点的尾插法,带头节点的头插法,带头节点的尾插法。
先来看这四种方法都需要用到的东西
typedef int ElemType;
typedef struct Node_s //定义链表节点的结构体
{
ElemType data; //数据域
struct Node_s *next; //指针域
}Node,*LinkList; //Node相当于struct Node_s Linklist相当于struct Node_s *
int Output_L(LinkList head) //输出不带头节点的单链表的元素
{
if(!head)
return -1;
LinkList p;
p=head;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 0;
}
int Output_HL(LinkList head) //输出带头节点的单链表的元素
{
if(!head)
return -1;
LinkList p;
p=head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 0;
}
一,不带头节点的头插法
int main()
{
int i;
Node *head = NULL;
Node *tail = NULL;
Node *new_Node = NULL;
for(i=0;i<10;i++)
{
new_Node = malloc(sizeof(Node));
new_Node->data = i+1;
new_Node->next = NULL; //将即将要插入的节点打包(数据域放什么,指针域放什么)
new_Node->next = head;
head = new_Node;
}
Output_L(head);
}
执行结果
二,带头节点的头插法
int main()
{
int i;
Node *head = NULL;
Node *new_Node = NULL;
head = malloc(sizeof(Node));
head->data = -1;
head->next = NULL;
for(i=0;i<10;i++)
{
new_Node = malloc(sizeof(Node));
new_Node->data = i+1;
new_Node->next = NULL;
new_Node->next = head->next;
head->next = new_Node;
}
Output_HL(head);
}
执行结果

三,不带头节点的尾插法
int main()
{
int i;
Node *head = NULL;
Node *tail = NULL;
Node *new_Node = NULL;
for(i=0;i<10;i++)
{
new_Node = malloc(sizeof(Node));
new_Node->data = i+1;
new_Node->next = NULL; //将即将要插入的节点打包(数据域放什么,指针域放什么)
if(head == NULL) //如果为空链表
{
head = new_Node; //头指针指向第一个节点
tail = new_Node; //尾指针指向第一个节点
}
else
{
tail->next = new_Node; //尾指针指向的节点(上一个节点)的指针域指向新插入的节点
tail = new_Node; //这两句不能反
}
}
Output_L(head);
}
执行结果
四,带头节点的尾插法
int main()
{
int i;
Node *head = NULL;
Node *tail = NULL;
Node *new_Node = NULL;
head = malloc(sizeof(Node));
head->data = -1;
head->next = NULL;
for(i=0;i<10;i++)
{
new_Node = malloc(sizeof(Node));
new_Node->data = i+1;
new_Node->next = NULL;
if(head->next == NULL)
{
head->next = new_Node;
tail = new_Node;
}
else
{
tail->next = new_Node; //这两句不能反
tail = new_Node;
}
}
Output_HL(head);
}
执行结果