
如果是带头结点,就只要插入 *** 作就可以,不要考虑那么多
单链表的生成有2种方式:头插法和尾插法。1、头插法
/*********************************************************************
* 函数名称:linklist *CreateLinklistHead()
* 函数功能:利用头插法创建链表
* 参数:无
* 返 回 值:创建完链表后的链表头结点
* 说明:无
*********************************************************************/
extern linklist *CreateLinklistHead()
{
int x, i, nodeNum
linklist *head, *temp // 头结点与临时结点
head = (linklist *)malloc(sizeof(linklist)) // 生成表头结点
head->next = NULL // 给表头结点的指针域赋值
printf("请输入链表中结点的个数:")
scanf("%d", &nodeNum)
for(i=1i<=nodeNumi++)
{
printf("请输入第 %d 个结点的数据:", i)
scanf("%d", &x)
temp = (linklist *)malloc(sizeof(linklist)) // 生成新的结点
temp->data = x // 对新结点的数据域赋值
// 将新结点插到头结点之后
temp->next = head->next
head->next = temp
}
return head // 返回新建链表的头结点
}2、尾插法
/*********************************************************************
* 函数名称:linklist *CreateLinklistRear()
* 函数功能:利用尾插法创建链表
* 参数:无
* 返 回 值:创建完链表后的链表头结点
* 说明:无
*********************************************************************/
extern linklist *CreateLinklistRear()
{
int x, i, nodeNum
linklist *head, *rear, *temp // 定义头结点、尾结点和临时结点
head = (linklist *)malloc(sizeof(linklist)) // 生成表头结点,表头结点不存放数据
head->next = NULL // 将表头结点的指针域赋值为NULL
rear = head // 将表头结点赋值给表尾结点
printf("请输入链表中结点的个数:")
scanf("%d", &nodeNum)
for(i=1i<=nodeNumi++)
{
printf("请输入第 %d 个结点的数据:", i)
scanf("%d", &x)
temp = (linklist *)malloc(sizeof(linklist)) // 生成新的结点
temp->data = x // 新增结点的数据域
temp->next = NULL// 新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)
rear->next = temp// 使前一个结点指向新增结点(head->next=temp)
rear = temp // 将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head->next)
}
//rear->next = NULL // 将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)
return head // 返回头结点
}
如果添加头结点,在第0个元素节点前插入数据的实现逻辑和在任意元素节点前插入数据的实现逻辑相同。如果不添加头结点,需要对插入位置进行判断:
如果是第0个元素,需要创建新节点,其next指向head,并且head修改指向为新节点;
如果不是第0个元素,直接找到第i-1个元素节点,插入新节点,其next指向第i个元素,同时修改第i-1个元素节点的next指向为新节点。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)