用C语言构造一个单链表程序,要求 (1)构造一个空的单链表L,其基本操作为LinkListInit(LinkList *L)。 (2)单链表L已存在,销毁单链表L,其基本操作为DestroyLinkList (LinkList *L)。 (3)单链表L已存在,若单链表L为空表,则返回0,否则返回1,调用函数可通过判断函数返回值确定结果状态,其基本操作为LinkListEmpty(LinkList *L)。 (4)单链表L已存在,返回单链表L中数据元素个数,其基本操作为LinkListLength (LinkList *L)。 (5)L为带头结点的单链表的头指针。当第i个元素存在时,返回其值,若这样的数据元素不存在,则给出相应的提示,其基本操作为GetLinkListElem(LinkList *L)。 (6)单链表L已存在,返回单链表L中第i个与e值相同的数据元素的位序,若这样的数据元素不存在,则给出相应的提示,其基本操作为LocateLinkListElem (LinkList *L, ElemType e)。 (7)在带头结点的单链表L中第i个位置之前插入元素e,若这样的数据元素不存在,则给出相应的提示,其基本操作为LinkListInsert(LinkList *L, int i, ElemType e)。 (8)在带头结点的单链表L中删除第i个元素,若这样的数据元素不存在或i值不符合要求,则给出相应的提示,其基本操作为LinkListDelete(LinkList *L, int i)。 (9)单链表L已存在,输出显示单链表L中的各个元素,其基本操作为DispLinkList(LinkList *L)。 (10) 头插法建立单链表L,其基本操作为CreateLinkListF(LinkList *L, ElemType d[ ], int n)。 (11) 尾插法建立单链表L,其基本操作为CreateLinkListR(LinkList *L, ElemType d[ ], int n)。

时间: 2024-03-26 12:40:45 浏览: 23
以下是您所要求的C语言单链表程序: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表结点的结构体 typedef struct Node { int data; struct Node *next; } Node, *LinkList; // 构造一个空的单链表L void LinkListInit(LinkList *L) { (*L) = (LinkList) malloc(sizeof(Node)); (*L)->next = NULL; } // 销毁单链表L void DestroyLinkList(LinkList *L) { LinkList p, q; p = (*L)->next; while (p != NULL) { q = p->next; free(p); p = q; } (*L)->next = NULL; } // 判断单链表L是否为空表 int LinkListEmpty(LinkList *L) { return (*L)->next == NULL; } // 返回单链表L中数据元素个数 int LinkListLength(LinkList *L) { int count = 0; LinkList p = (*L)->next; while (p != NULL) { count++; p = p->next; } return count; } // 返回单链表L中第i个元素的值 int GetLinkListElem(LinkList *L, int i) { int j = 0; LinkList p = (*L)->next; while (p != NULL && j < i) { p = p->next; j++; } if (p == NULL || j > i) { printf("第%d个元素不存在\n", i); exit(1); } return p->data; } // 返回单链表L中第一个值为e的数据元素的位序 int LocateLinkListElem(LinkList *L, int e) { int i = 0; LinkList p = (*L)->next; while (p != NULL && p->data != e) { p = p->next; i++; } if (p == NULL) { printf("元素%d不存在\n", e); return -1; } return i; } // 在单链表L的第i个位置之前插入元素e void LinkListInsert(LinkList *L, int i, int e) { int j = 0; LinkList p = (*L), s; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL || j > i - 1) { printf("无法插入元素\n"); exit(1); } s = (LinkList) malloc(sizeof(Node)); s->data = e; s->next = p->next; p->next = s; } // 删除单链表L中第i个元素 void LinkListDelete(LinkList *L, int i) { int j = 0; LinkList p = (*L), q; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL || j > i - 1 || p->next == NULL) { printf("无法删除元素\n"); exit(1); } q = p->next; p->next = q->next; free(q); } // 输出显示单链表L中的各个元素 void DispLinkList(LinkList *L) { LinkList p = (*L)->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 头插法建立单链表L void CreateLinkListF(LinkList *L, int d[], int n) { (*L) = (LinkList) malloc(sizeof(Node)); (*L)->next = NULL; LinkList p; for (int i = 0; i < n; i++) { p = (LinkList) malloc(sizeof(Node)); p->data = d[i]; p->next = (*L)->next; (*L)->next = p; } } // 尾插法建立单链表L void CreateLinkListR(LinkList *L, int d[], int n) { (*L) = (LinkList) malloc(sizeof(Node)); (*L)->next = NULL; LinkList p, q = (*L); for (int i = 0; i < n; i++) { p = (LinkList) malloc(sizeof(Node)); p->data = d[i]; q->next = p; q = p; } q->next = NULL; } int main() { LinkList L; int d[] = {1, 2, 3, 4, 5}; int n = sizeof(d) / sizeof(int); // 构造一个空的单链表L LinkListInit(&L); // 头插法建立单链表L CreateLinkListF(&L, d, n); printf("头插法建立单链表L:"); DispLinkList(&L); // 尾插法建立单链表L CreateLinkListR(&L, d, n); printf("尾插法建立单链表L:"); DispLinkList(&L); // 返回单链表L中数据元素个数 printf("单链表L中数据元素个数:%d\n", LinkListLength(&L)); // 返回单链表L中第3个元素的值 printf("单链表L中第3个元素的值:%d\n", GetLinkListElem(&L, 3)); // 返回单链表L中第一个值为3的数据元素的位序 printf("单链表L中第一个值为3的数据元素的位序:%d\n", LocateLinkListElem(&L, 3)); // 在单链表L的第3个位置之前插入元素6 LinkListInsert(&L, 3, 6); printf("在单链表L的第3个位置之前插入元素6:"); DispLinkList(&L); // 删除单链表L中第4个元素 LinkListDelete(&L, 4); printf("删除单链表L中第4个元素:"); DispLinkList(&L); // 销毁单链表L DestroyLinkList(&L); return 0; } ``` 以上程序实现了您所要求的所有基本操作。需要注意的是,本程序实现的是整型单链表,如果需要存储其他类型的数据,需要修改定义单链表结点的结构体和相关函数的参数和返回值类型。

相关推荐

构造一个单链表,要求:(1)构造一个空的单链表L,其基本操作为LinkListInit(LinkList *L)。 (2)单链表L已存在,销毁单链表L,其基本操作为DestroyLinkList (LinkList *L)。 (3)单链表L已存在,若单链表L为空表,则返回0,否则返回1,调用函数可通过判断函数返回值确定结果状态,其基本操作为LinkListEmpty(LinkList *L)。 (4)单链表L已存在,返回单链表L中数据元素个数,其基本操作为LinkListLength (LinkList *L)。 (5)L为带头结点的单链表的头指针。当第i个元素存在时,返回其值,若这样的数据元素不存在,则给出相应的提示,其基本操作为GetLinkListElem(LinkList *L)。 (6)单链表L已存在,返回单链表L中第i个与e值相同的数据元素的位序,若这样的数据元素不存在,则给出相应的提示,其基本操作为LocateLinkListElem (LinkList *L, ElemType e)。 (7)在带头结点的单链表L中第i个位置之前插入元素e,若这样的数据元素不存在,则给出相应的提示,其基本操作为LinkListInsert(LinkList *L, int i, ElemType e)。 (8)在带头结点的单链表L中删除第i个元素,若这样的数据元素不存在或i值不符合要求,则给出相应的提示,其基本操作为LinkListDelete(LinkList *L, int i)。 (9)单链表L已存在,输出显示单链表L中的各个元素,其基本操作为DispLinkList(LinkList *L)。 (10) 头插法建立单链表L,其基本操作为CreateLinkListF(LinkList *L, ElemType d[ ], int n)。 (11) 尾插法建立单链表L,其基本操作为CreateLinkListR(LinkList *L, ElemType d[ ], int n)。

最新推荐

recommend-type

简易图片检索软件(图像动态显示软件)

首先设置待检索文件夹路径,设置完成解锁开始按钮,点击即可自动查阅文件夹下的图像。可设置每张图像的显示高度、显示停留时间及整体循环次数。 exe应用界面文件在路径disk/load_picture/load_picture.exe 点击exe应用及即可。
recommend-type

树状数组详解资源.zip

树状数组
recommend-type

哈尔滨工程大学单独考试2020考研专业课初试大纲.pdf

哈尔滨工程大学考研初试大纲
recommend-type

基于OpenWatcom的链接器的链接器.zip

链接器 二、链接器主要任务: GNU ld(链接器)是用于将多个目标文件(包括目标文件、共享库、目标文件的归档文件等)合并成一个可执行文件或共享库的重要工具。它的主要功能包括:符号解析和重定位:链接器识别并解析输入文件中的符号引用,然后执行重定位操作以确保这些引用指向正确的地址。这包括将模块中的符号引用与其定义进行匹配,以便在合并时连接它们。 合并输入文件:链接器将多个输入文件中的代码段、数据段等模块合并成一个单一的地址空间。这包括将不同模块中的代码和数据安排到正确的内存地址中。 生成输出文件:链接器将合并的模块和符号表等信息写入输出文件中,该输出文件可以是可执行文件、共享库、目标文件等,具体类型取决于链接器的参数和配置。 符号表处理:链接器生成输出文件的符号表,其中包含了可供调试和动态链接器使用的符号信息。 处理重定位信息:如果存在重定位信息,链接器将生成重定位表,用于在加载时修正代码和数据的地址。这使得程序可以在不同的内存地址上运行。 处理链接器脚本:链接器可以根据链接器脚本(linker script)中的规则和指令来组织和排列模块,以满足特定需求。链接器脚本可以
recommend-type

tensorflow-2.9.0-cp37-cp37m-win-amd64.whl

tensorflow安装
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性

![MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性](https://picx.zhimg.com/80/v2-8132d9acfebe1c248865e24dc5445720_1440w.webp?source=1def8aca) # 1. MATLAB结构体基础** MATLAB结构体是一种数据结构,用于存储和组织相关数据。它由一系列域组成,每个域都有一个名称和一个值。结构体提供了对数据的灵活访问和管理,使其成为组织和处理复杂数据集的理想选择。 MATLAB中创建结构体非常简单,使用struct函数即可。例如: ```matlab myStruct
recommend-type

详细描述一下STM32F103C8T6怎么与DHT11连接

STM32F103C8T6可以通过单总线协议与DHT11连接。连接步骤如下: 1. 将DHT11的VCC引脚连接到STM32F103C8T6的5V电源引脚; 2. 将DHT11的GND引脚连接到STM32F103C8T6的GND引脚; 3. 将DHT11的DATA引脚连接到STM32F103C8T6的GPIO引脚,可以选择任一GPIO引脚,需要在程序中配置; 4. 在程序中初始化GPIO引脚,将其设为输出模式,并输出高电平,持续至少18ms,以激活DHT11; 5. 将GPIO引脚设为输入模式,等待DHT11响应,DHT11会先输出一个80us的低电平,然后输出一个80us的高电平,
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。