带头结点和不带头结点的单链表的尾插法以及各种操作

本文详细介绍了带头结点和不带头结点的单链表的创建、尾插法插入元素以及删除节点的操作。通过示例代码展示了如何在不同位置进行插入和删除,并强调了在插入时注意字符的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一.带头结点的单链表

先说一下create()建立的链表,采用cycle的方式。

/*************************************************************

带头结点的单链表13-1-1ex3.cpp

1.建立单链表

2.求链表长度

3.在第i个位置插入元素(种方法)

4.删除指定序号的节点

由于本程序是带头节点的,所以在删除函数Del()和插入函数InsertList()

中,head均没有被改变,所以,主函数中,用了Del和InsertList之后

均没有改变head,在PrintList中,还可以继续把head传入。如果是这样

的话,这两个函数完全可以定义成void类型,而不是Node *类型的

只要将Create()定义成Node *就行,再在main()中定义一个指针head

将head=Create();以后这个head都不会变了。好像带头节点链表的这些

常规操作均不改变Head节点。

**************************************************************/

#include<stdio.h>

#include<stdlib.h>

//#include<string.h>

//#include<conio.h>

 

typedef struct student

{

         int data;

         struct student *next;

         //struct student *pre;

}Node;

 

 

int GetLength(Node *head)

{

         int n=0;

         Node *p;

         p=head->next;

         while(p!=NULL)

         {

                  p=p->next;

                  n++;

         }

         return n;

}

 

Node *InsertList(Node *head, int x, int i) //插入元素方法1

{

         Node *p, *q, *s;

         int j=1;

         p=head;

         if(i<1 || i>GetLength(head)+1)

         {

                  exit(1);

         }

         s=(Node *)malloc(sizeof(Node));

         s->data=x;

         while(j<=i)

         {

                  q=p;

                  p=p->next;

     
### 使用尾插法创建带头结点单链表 在C语言中,使用尾插法可以高效地构建一个带头结点单链表。以下是具体的实现方法: #### 实现思路 为了实现尾插法创建带头结点单链表,需要定义一个新的指针变量来跟踪当前链表的最后一个节点。初始时,该指针指向第一个节点(即头节点),随着每次插入操作更新其位置。 #### 代码实现 下面是基于尾插法创建带头结点单链表的具体函数实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } LinkList; LinkList* CreateListTailNoHead(int *arr, int length) { if (length <= 0) return NULL; // 如果数组为空,则返回NULL // 创建首元结点并初始化 LinkList *head = (LinkList *)malloc(sizeof(LinkList)); head->data = arr[0]; head->next = NULL; LinkList *tail = head; // tail用于记录当前链表的最后结点 for (int i = 1; i < length; ++i) { // 从第二个元素开始遍历 LinkList *newNode = (LinkList *)malloc(sizeof(LinkList)); newNode->data = arr[i]; newNode->next = NULL; tail->next = newNode; // 当前最后结点连接新结点 tail = newNode; // 更新tail为新的最后结点 } return head; // 返回头结点 } ``` 此代码片段展示了如何通过尾插法动态分配内存以创建一个带额外头结点单链表[^2]。 #### 关键点解析 - **首元结点**:由于此处采用的是带头结点的方式,因此首个被插入的数据项会成为整个链表的第一个实际有效数据结点。 - **`tail`的作用**:始终指向当前已构建部分的最后一项,从而使得后续新增加的每一项都能直接附加在其后面而无需重新扫描整条链路寻找末端位置[^3]。 #### 测试示例 下面提供了一个简单的测试例子展示上述功能的实际应用效果: ```c void PrintList(LinkList *list){ while(list != NULL){ printf("%d ", list->data); list = list->next; } } int main(){ int array[] = {1, 2, 3, 4}; int size = sizeof(array)/sizeof(array[0]); LinkList *myList = CreateListTailNoHead(array, size); PrintList(myList); return 0; } // 输出应为: 1 2 3 4 ``` 以上程序能够按照指定顺序依次打印出由输入数组所组成的单向链接列表中的各个数值[^4].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值