/*
===============================================
* 文件名称:单链表.c
* 创 建 者: xx
* 创建日期:2024年04月09日
* 描 述:本程序实现了一个简单的单链表数据结构,包含了初始化链表、头插法插入元素、尾插法插入元素、按位置删除节点、修改节点值、遍历显示链表、查找指定元素的位置以及计算链表长度等功能。
================================================*/
#include <stdio.h>
#include <stdlib.h>
// 定义链表元素类型为整型
typedef int ELEMTYPE;
// 定义单链表结点结构体
typedef struct list
{
ELEMTYPE data; // 数据域,存储元素
struct list *next; // 指针域,指向下一个结点
} List;
// 初始化链表函数
List *InitList()
{
// 分配一个结点的空间
List *head = (List *)malloc(sizeof(List));
// 检查内存分配是否成功
if (head == NULL)
{
printf("内存空间分配失败\n");
return NULL;
}
// 初始化新结点的next指针为NULL,表示链表为空
head->next = NULL;
// 返回链表头结点
return head;
}
// 头部插入元素函数
void HeadInsertList(List *head, ELEMTYPE data)
{
// 如果链表头结点为空,则直接返回
if (head == NULL)
return;
// 创建新结点
List *newNode = (List *)malloc(sizeof(List));
// 检查内存分配是否成功
if (newNode == NULL)
{
printf("内存空间分配失败\n");
return;
}
// 设置新结点的数据域
newNode->data = data;
// 将新结点的next指针指向原链表头结点的下一个结点
newNode->next = head->next;
// 更新头结点的next指针,使其指向新结点
head->next = newNode;
}
// 尾部插入元素函数
void TailInsertList(List *head, ELEMTYPE data)
{
// 如果链表头结点为空,则直接返回
if (head == NULL)
return;
// 创建新结点
List *newNode = (List *)malloc(sizeof(List));
// 检查内存分配是否成功
if (newNode == NULL)
{
printf("内存空间分配失败\n");
return;
}
// 设置新结点的数据域
newNode->data = data;
// 新结点的next指针初始化为NULL,表示链表尾部
newNode->next = NULL;
// 找到链表的尾部
List *p = head;
while (p->next != NULL)
p = p->next;
// 将尾结点的next指针指向新结点
p->next = newNode;
}
// 删除指定位置的元素函数
void DeleteList(List *head, int pos)
{
// 如果链表头结点为空,则直接返回
if (!head)
return;
// 寻找待删除结点的前一个结点
List *p = head;
while (--pos)
p = p->next;
// 获取待删除结点
List *q = p->next;
// 更新前驱结点的数据域为待删除结点的数据
p->data = q->data;
// 更新前驱结点的next指针跳过待删除结点
p->next = q->next;
// 释放待删除结点占用的内存
free(q);
// 防止野指针问题,将待删除结点指针置空
q = NULL;
}
// 修改指定位置元素的值函数
void ModifyList(List *head, int pos, ELEMTYPE data)
{
// 如果链表头结点为空,则直接返回
if (!head)
return;
// 寻找指定位置的结点
List *p = head;
while (--pos)
p = p->next;
// 更新结点的数据域
p->data = data;
}
// 显示链表函数
void ShowList(List *head)
{
// 从头结点的下一个结点开始遍历链表
List *p = head->next;
while (p != NULL)
{
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
// 查找指定元素的位置函数
void SelectList(List *head, ELEMTYPE data)
{
int pos = 0;
// 从头结点的下一个结点开始遍历链表
List *p = head->next;
while (p->data != data)
{
pos++;
p = p->next;
}
printf("pos:%d\n", pos);
}
// 计算链表长度函数
int LenList(List *head)
{
int len = 0;
// 从头结点开始遍历链表,直到遇到NULL为止
List *p = head;
while (p->next)
{
p = p->next;
len++;
}
// 返回链表长度
return len;
}
// 主函数
int main(int argc, char *argv[])
{
// 初始化链表
List *head = InitList();
// 使用尾插法向链表中插入10个元素
for (int i = 0; i < 10; i++)
{
TailInsertList(head, i);
}
// 显示原始链表
ShowList(head);
// 删除第5个元素
DeleteList(head, 5);
// 显示删除元素后的链表
ShowList(head);
// 修改第4个元素的值为111
ModifyList(head, 4, 111);
// 显示修改元素后的链表
ShowList(head);
// 查找元素9的位置
SelectList(head, 9);
// 输出链表长度
printf("len:%d\n", LenList(head));
// 主函数结束,程序退出
return 0;
}
单链表的创建
最新推荐文章于 2024-06-19 23:39:22 发布
![](https://img-home.csdnimg.cn/images/20240611030827.png)