根据提供的文件信息,本文将详细解释使用C语言实现的字符型数据链表的基本操作,包括创建链表、插入元素、删除元素以及查找元素等关键功能。 ### 一、链表的基本概念 在计算机科学中,链表是一种常用的数据结构,它通过一系列节点组成,每个节点包含实际的数据和指向下一个节点的指针。对于本篇讨论的字符型数据链表而言,每个节点都存储一个字符数据,并且具有指向下一个节点的指针。 ### 二、链表的创建 #### 1. **顺序创建** 代码片段中提供了一个`CreatList`函数用于按顺序创建链表。该函数接收一个整数`n`作为参数,表示需要创建的链表长度。具体实现步骤如下: - 首先分配一个头节点`head`,并初始化其`next`指针为`NULL`。 - 使用一个指针`r`指向头节点,然后通过循环获取用户输入的字符,为每个字符创建一个新的节点,并将其链接到链表的末尾。 - 最后返回头节点指针。 ```c LinkList*CreatList(int n) { LinkList* head = (LinkList*)malloc(sizeof(LinkList)); head->next = NULL; LinkList* r = head; for (int k = 1; k <= n; k++) { datatype x; scanf("%c", &x); LinkList* p = (LinkList*)malloc(sizeof(LinkList)); p->data = x; p->next = NULL; r->next = p; r = p; } return head; } ``` #### 2. **逆序创建** 此外,还提供了一个`Creat_List`函数用于逆序创建链表。与顺序创建不同的是,新节点被插入到链表的头部而不是尾部。具体实现步骤如下: - 初始化一个空链表`head`。 - 通过循环获取用户输入的字符,并为每个字符创建一个新的节点。 - 将新节点的`next`指针指向当前的链表头部,然后更新链表头部为新节点。 - 最后再次添加一个空节点作为头节点。 ```c LinkList*Creat_List(int n) { LinkList* head = NULL; for (int k = 1; k <= n; k++) { datatype x; scanf("%c", &x); LinkList* p = (LinkList*)malloc(sizeof(LinkList)); p->data = x; p->next = head; head = p; } LinkList* newHead = (LinkList*)malloc(sizeof(LinkList)); newHead->next = head; head = newHead; return head; } ``` ### 三、元素的查找 链表中的元素可以通过两种方式查找:按索引查找和按值查找。 #### 1. **按索引查找** `GetElem`函数用于根据索引查找元素。首先定义一个指针`p`指向链表的头部,然后遍历链表直到找到第`i`个元素或链表结束。如果找到了,则输出该元素的值;否则提示找不到该元素。 ```c void GetElem(LinkList* head, int i) { int j = 0; LinkList* p = head; while (p->next != NULL && j < i) { p = p->next; j++; } if (j == i && i > 0) printf("The value is %c.\n", p->data); else printf("The value is not exit.\n"); } ``` #### 2. **按值查找** `Get_Elem`函数用于根据元素值查找。同样地,定义一个指针`p`指向链表的头部,然后遍历链表直到找到值为`x`的元素或链表结束。如果找到了,则输出该元素存在;否则提示不存在。 ```c void Get_Elem(LinkList* head, datatype x) { LinkList* p = head->next; while (p->data != x && p != NULL) { p = p->next; } if (p != NULL) printf("The Value is exit.\n"); else printf("The Value is not exit.\n"); } ``` ### 四、元素的插入 链表中可以插入元素到指定位置或当前节点前。 #### 1. **插入到指定位置** `Insert_1`函数用于在指定位置插入一个新元素。该函数接收链表头指针`head`、待插入的元素值`x`和插入位置`i`作为参数。具体实现如下: - 定义一个指针`p`指向链表的头部,然后遍历链表直到到达第`i-1`个节点。 - 创建一个新节点`s`,并将其`next`指针指向当前节点的下一个节点,再将当前节点的`next`指针指向新节点。 - 如果插入成功,则返回链表头指针。 ```c LinkList* Insert_1(LinkList* head, datatype x, int i) { int j = 0; LinkList* p = head; LinkList* s = (LinkList*)malloc(sizeof(LinkList)); s->data = x; while (p->next != NULL && j < i) { p = p->next; j++; } if (j == i && i > 0) { s->next = p->next; p->next = s; printf("插入成功。\n"); return head; } else { printf("插入失败。\n"); return head; } } ``` #### 2. **插入到当前节点前** `Insert_2`函数用于在当前节点前插入一个新元素。与`Insert_1`类似,但插入位置不同。具体实现如下: - 定义一个指针`p`指向链表的头部,然后遍历链表直到到达第`i-2`个节点。 - 创建一个新节点`s`,并将其`next`指针指向当前节点的下一个节点,再将当前节点的`next`指针指向新节点。 - 如果插入成功,则返回链表头指针。 ```c LinkList* Insert_2(LinkList* head, datatype x, int i) { int j = 0; LinkList* p = head; LinkList* s = (LinkList*)malloc(sizeof(LinkList)); s->data = x; while (p->next != NULL && j < i - 1) { p = p->next; j++; } if (j == i - 1) { s->next = p->next; p->next = s; printf("插入成功。\n"); } else { printf("插入失败。\n"); } return head; } ``` ### 五、元素的删除 链表中的元素可以通过其位置进行删除。 #### 1. **删除指定位置的元素** `Delete`函数用于删除指定位置的元素。该函数接收链表头指针`head`和待删除位置`i`作为参数。具体实现如下: - 定义一个指针`p`指向链表的头部,然后遍历链表直到到达第`i-2`个节点。 - 定义一个指针`s`指向待删除的节点,然后更新当前节点的`next`指针指向下一个节点。 - 最后释放被删除节点所占用的内存,并返回链表头指针。 ```c LinkList* Delete(LinkList* head, int i) { int j = 0; LinkList* p = head; while (p->next != NULL && j < i - 1) { p = p->next; j++; } if (j == i - 1) { LinkList* s = p->next; p->next = p->next->next; free(s); printf("删除成功。\n"); } else { printf("删除失败。\n"); } return head; } ``` 通过上述介绍,我们可以看到链表作为一种动态数据结构,在C语言中的实现非常灵活。这些基本操作为链表的使用提供了强大的支持,可以广泛应用于各种实际场景中。
#include<stdlib.h>
typedef char datatype;
typedef struct node{ //结点类型定义
datatype data; //定义数据域
struct node *next; //定义指针域
}LinkList;
LinkList *CreatList(int n) //使用尾插法创建链表
{
int k; datatype x;
LinkList *head,*r,*p;
head=(LinkList *)malloc(sizeof(LinkList)); //带头结点
head->next=NULL;
r=head; //尾指针
printf("\n请输入各个元素:");
for(k=1;k<=n;k++){
scanf("%c",&x);
p=(LinkList *)malloc(sizeof(LinkList));//创建新结点
p->data=x;
p->next=NULL;
r->next=p; //将新创建的结点连接到链表尾部
r=p; //尾指针后移,指向尾结点,即刚连接的结点
}
return head;
}
LinkList *Creat_List(int n) //使用头插法创建链表
{
int k; datatype x;
LinkList *head,*p;
head=NULL;
for(k=1;k<=n;k++){
scanf("%c",&x);
p=(LinkList *)malloc(sizeof(LinkList));//创建新结点
p->data=x;
p->next=head;
head=p;
}
p=(LinkList *)malloc(sizeof(LinkList));//带头结点
p->next=head;
head=p;
return head;
}
void GetElem(LinkList *head,int i) //按序列号查找
{
int j=0;
LinkList *p;
p=head;
while(p->next!=NULL&&j<i){
p=p->next;
j++;
}
if(j==i&&i>0) printf("\nThe value is %c.\n",p->data); //找到后,输出该值
else printf("\nThe value is not exit.\n");
}
void Get_Elem(LinkList *head,datatype x) //按值查找
{
LinkList *p;
p=head->next;
while(p->data!=x&&p!=NULL){
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 16
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- fish-kong,Yolov5-Instance-Seg-Tensorrt-CPP.zip
- 排球场地的排球识别 yolov7标记
- 微信小程序毕业设计-基于SSM的英语学习激励系统【代码+论文+PPT】.zip
- DOTA 中的 YOLOX 损失了 KLD (定向物体检测)(Rotated BBox)基于YOLOX的旋转目标检测.zip
- caffe-yolo-9000.zip
- 11sadsadfasfsafasf
- Android 凭证交换和更新协议 - “你只需登录一次”.zip
- 2024 年 ICONIP 展会.zip
- 微信小程序毕业设计-基于SSM的电影交流小程序【代码+论文+PPT】.zip
- 微信小程序毕业设计-基于SSM的食堂线上预约点餐小程序【代码+论文+PPT】.zip