设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。具体实现要求: (1)从键盘输入20个整数,用前插法或尾插法输入结点值。 (2)从键盘输入1个整数,在单链表中查找该结点的位置。若找到,则显示“找到了”;否则,则显示“找不到”。 (3)从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。 (4)从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。 (5)将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。 (6)删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。 (7)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。用C语言

时间: 2024-02-13 13:02:08 浏览: 23
以下是单链表的实现代码: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 头插法插入节点 void insertAtHead(Node** head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = *head; *head = newNode; } // 尾插法插入节点 void insertAtTail(Node** head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if (*head == NULL) { *head = newNode; return; } Node* cur = *head; while (cur->next != NULL) { cur = cur->next; } cur->next = newNode; } // 查找节点位置 int findNode(Node* head, int value) { int pos = 0; Node* cur = head; while (cur != NULL) { pos++; if (cur->data == value) { printf("找到了,位置为%d\n", pos); return pos; } cur = cur->next; } printf("找不到\n"); return -1; } // 插入节点 void insertNode(Node** head, int pos, int data) { if (pos == 1) { insertAtHead(head, data); return; } Node* cur = *head; for (int i = 1; i < pos-1 && cur != NULL; i++) { cur = cur->next; } if (cur == NULL) { printf("插入位置超出链表长度\n"); return; } Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = cur->next; cur->next = newNode; } // 删除节点 void deleteNode(Node** head, int pos) { if (*head == NULL) { printf("链表为空\n"); return; } Node* cur = *head; if (pos == 1) { *head = cur->next; free(cur); return; } for (int i = 1; i < pos-1 && cur != NULL; i++) { cur = cur->next; } if (cur == NULL || cur->next == NULL) { printf("删除位置超出链表长度\n"); return; } Node* toDelete = cur->next; cur->next = toDelete->next; free(toDelete); } // 删除重复节点 void deleteDuplicate(Node** head) { if (*head == NULL) { printf("链表为空\n"); return; } Node* cur = *head; while (cur != NULL) { Node* innerCur = cur; while (innerCur->next != NULL) { if (innerCur->next->data == cur->data) { Node* toDelete = innerCur->next; innerCur->next = toDelete->next; free(toDelete); } else { innerCur = innerCur->next; } } cur = cur->next; } } // 删除偶数节点 void deleteEven(Node** head) { if (*head == NULL) { printf("链表为空\n"); return; } Node* cur = *head; Node* prev = NULL; while (cur != NULL) { if (cur->data % 2 == 0) { if (prev == NULL) { *head = cur->next; } else { prev->next = cur->next; } Node* toDelete = cur; cur = cur->next; free(toDelete); } else { prev = cur; cur = cur->next; } } } // 分解链表 void splitList(Node* head, Node** aHead, Node** bHead) { if (head == NULL) { return; } Node* curA = NULL; Node* curB = NULL; Node* cur = head; int index = 1; while (cur != NULL) { if (index % 2 != 0) { if (curA == NULL) { *aHead = cur; curA = cur; } else { curA->next = cur; curA = curA->next; } } else { if (curB == NULL) { *bHead = cur; curB = cur; } else { curB->next = cur; curB = curB->next; } } cur = cur->next; index++; } if (curA != NULL) { curA->next = NULL; } if (curB != NULL) { curB->next = NULL; } } // 输出链表 void printList(Node* head) { Node* cur = head; while (cur != NULL) { printf("%d ", cur->data); cur = cur->next; } printf("\n"); } int main() { Node* head = NULL; Node* aHead = NULL; Node* bHead = NULL; // 输入20个整数,用尾插法输入结点值 printf("请输入20个整数(用空格隔开):\n"); for (int i = 0; i < 20; i++) { int num; scanf("%d", &num); insertAtTail(&head, num); } // 在单链表中查找节点 printf("请输入要查找的整数:\n"); int value; scanf("%d", &value); findNode(head, value); // 插入节点 printf("请输入要插入节点的位置和数据(用空格隔开):\n"); int pos, data; scanf("%d %d", &pos, &data); insertNode(&head, pos, data); printf("插入节点后的链表:\n"); printList(head); // 删除节点 printf("请输入要删除节点的位置:\n"); scanf("%d", &pos); deleteNode(&head, pos); printf("删除节点后的链表:\n"); printList(head); // 删除重复节点 deleteDuplicate(&head); printf("删除重复节点后的链表:\n"); printList(head); // 删除偶数节点 deleteEven(&head); printf("删除偶数节点后的链表:\n"); printList(head); // 分解链表 splitList(head, &aHead, &bHead); printf("链表A:\n"); printList(aHead); printf("链表B:\n"); printList(bHead); return 0; } ```

相关推荐

最新推荐

单纯形算法及对偶的python实现

1.建立模型后输入数据列出初始单纯形表 将线性规划问题转化为标准型,求minz转化为求max-z 以下图为例 初始化 import numpy as np class Simplex(object): #构造函数(初始化函数) def __init__(self,z,B,bound)...

《算法设计与分析》实验报告:实验二(线性选择问题)

在快速排序算法基础上,进一步完成线性时间选择算法,并且用不同数据量进行实验对比分析,要求分析算法的时间复杂性并且形成分析报告

Python实现的线性回归算法示例【附csv文件下载】

主要介绍了Python实现的线性回归算法,涉及Python使用最小二乘法、梯度下降算法实现线性回归相关算法操作与使用技巧,需要的朋友可以参考下

Python实现多元线性回归方程梯度下降法与求函数极值

假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候...

2020 年TI 杯大学生电子设计竞赛 E 题:放大器非线性失真研究装置

2020 年TI 杯大学生电子设计竞赛 E 题:放大器非线性失真研究装置 设计并制作一个放大器非线性失真研究装置,其组成如图1所示,图中的 和 为 1×2切换开关,晶体管放大器只允许有一个输入端口和一个输出端口。

stc12c5a60s2 例程

stc12c5a60s2 单片机的所有功能的实例,包括SPI、AD、串口、UCOS-II操作系统的应用。

管理建模和仿真的文件

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

【迁移学习在车牌识别中的应用优势与局限】: 讨论迁移学习在车牌识别中的应用优势和局限

![【迁移学习在车牌识别中的应用优势与局限】: 讨论迁移学习在车牌识别中的应用优势和局限](https://img-blog.csdnimg.cn/direct/916e743fde554bcaaaf13800d2f0ac25.png) # 1. 介绍迁移学习在车牌识别中的背景 在当今人工智能技术迅速发展的时代,迁移学习作为一种强大的技术手段,在车牌识别领域展现出了巨大的潜力和优势。通过迁移学习,我们能够将在一个领域中学习到的知识和模型迁移到另一个相关领域,从而减少对大量标注数据的需求,提高模型训练效率,加快模型收敛速度。这种方法不仅能够增强模型的泛化能力,提升识别的准确率,还能有效应对数据

margin-top: 50%;

margin-top: 50%; 是一种CSS样式代码,用于设置元素的上边距(即与上方元素或父级元素之间的距离)为其父元素高度的50%。 这意味着元素的上边距将等于其父元素高度的50%。例如,如果父元素的高度为100px,则该元素的上边距将为50px。 请注意,这个值只在父元素具有明确的高度(非auto)时才有效。如果父元素的高度是auto,则无法确定元素的上边距。 希望这个解释对你有帮助!如果你还有其他问题,请随时提问。

Android通过全局变量传递数据

在Activity之间数据传递中还有一种比较实用的方式 就是全局对象 实用J2EE的读者来说都知道Java Web的四个作用域 这四个作用域从小到大分别是Page Request Session和Application 其中Application域在应用程序的任何地方都可以使用和访问 除非是Web服务器停止 Android中的全局对象非常类似于Java Web中的Application域 除非是Android应用程序清除内存 否则全局对象将一直可以访问 1 定义一个类继承Application public class MyApp extends Application 2 在AndroidMainfest xml中加入全局变量 android:name &quot; MyApp&quot; 3 在传数据类中获取全局变量Application对象并设置数据 myApp MyApp getApplication ; myApp setName &quot;jack&quot; ; 修改之后的名称 4 在收数据类中接收Application对象 myApp MyApp getApplication ;">在Activity之间数据传递中还有一种比较实用的方式 就是全局对象 实用J2EE的读者来说都知道Java Web的四个作用域 这四个作用域从小到大分别是Page Request Session和Application 其中Application域在应用程序的任何地方都可以使用和 [更多]