1.带头结点的单向链表的结构
head指针始终指向头结点,head->data不放元素。当head->next==NULL时,链表为空表,不为空表时,head->next指向首结点,即head->next=a1。
2.单向链表带头结点和不带头结点的区别
区别主要有两个方面:
(1)使用头结点后在链表中第一个结点位置插入和删除操作更加方便。
(2)使用头结点后,对于空链表和非空链表的操作是一样的。如果不使用头结点,当链表非空时,头指针指向第一个结点的地址,如果是空链表,头指针为NULL,此时空链表和非空链表的操作是不一样的。
3.带头结点的单向链表是功能实现(附详细代码)
在此之前,如果不太懂不带头结点的单向链表的实现,可以去这里看看,点击进入不带头结点的单向链表的实现
带头结点的单向链表的实现如下:
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct LinkNode{
ElemType data;
struct LinkNode *pNext;
}LinkNode;
LinkNode *pHead = NULL; //单向链表的头指针
LinkNode *pEnd = NULL; //单向链表的尾指针
//创建单向链表节点
void CreateNode(LinkNode *pNode)
{
if(NULL != pNode)
{
printf("请输入结点数据:");
scanf("%d", &pNode->data);
}
pNode->pNext = NULL;
}
//创建单向链表(带头节点),可以理解为创建一个空表,创建的链表中只包含一个头结点
void CreateLinkList()
{
LinkNode *pNew = malloc(sizeof(LinkNode));
pNew->data = NULL; //头结点不放元素
pNew->pNext = NULL;
pHead = pNew;//将头、尾指针都指向头结点
pEnd = pNew;
printf("创建链表成功!\n");
}
//添加结点,结点后面依次按顺序添加,注意与后面的插入结点区分开
void AddNode()
{
LinkNode *pNew = malloc(sizeof(LinkNode));
CreateNode(pNew);
pEnd->pNext = pNew;
pEnd = pNew;
pri