c语言实例

ops/2024/10/21 7:39:38/

大家好,欢迎来到无限大的频道

今天给大家带来的是c语言

题目描述

创建一个双链表,并将链表中的数据输出到控制台,输入要查找的数据,将查找到的数据删除,并且显示删除后的链表

下面是一个用C语言实现的双链表(Doubly Linked List)程序,包括创建链表、输出链表、查找并删除数据的功能。代码会将链表的数据输出到控制台,并在删除指定数据后显示删除后的链表。

#include <stdio.h>  
#include <stdlib.h>  // 定义双链表节点  
typedef struct Node {  int data;  struct Node* next;  struct Node* prev;  
} Node;  // 创建新节点  
Node* createNode(int data) {  Node* newNode = (Node*)malloc(sizeof(Node));  newNode->data = data;  newNode->next = NULL;  newNode->prev = NULL;  return newNode;  
}  // 在链表末尾添加节点  
void append(Node** head_ref, int new_data) {  Node* new_node = createNode(new_data);  Node* last = *head_ref;  if (*head_ref == NULL) {  *head_ref = new_node;  return;  }  while (last->next != NULL)  last = last->next;  last->next = new_node;  new_node->prev = last;  
}  // 打印链表  
void printList(Node* node) {  while (node != NULL) {  printf("%d ", node->data);  node = node->next;  }  printf("\n");  
}  // 查找并删除节点  
void deleteNode(Node** head_ref, int key) {  Node* temp = *head_ref;  // 如果头节点包含要删除的值  if (temp != NULL && temp->data == key) {  *head_ref = temp->next;  if (*head_ref != NULL)  (*head_ref)->prev = NULL;  free(temp);  return;  }  // 查找要删除的节点  while (temp != NULL && temp->data != key)  temp = temp->next;  // 如果未找到要删除的节点  if (temp == NULL) {  printf("未找到数据为 %d 的节点。\n", key);  return;  }  // 更改指针以删除节点  if (temp->next != NULL)  temp->next->prev = temp->prev;  if (temp->prev != NULL)  temp->prev->next = temp->next;  free(temp);  
}  // 主函数  
int main() {  Node* head = NULL;  // 创建链表并添加数据  append(&head, 10);  append(&head, 20);  append(&head, 30);  append(&head, 40);  printf("原始链表: ");  printList(head);  int dataToDelete;  printf("请输入要删除的数据: ");  scanf("%d", &dataToDelete);  deleteNode(&head, dataToDelete);  printf("删除后的链表: ");  printList(head);  return 0;  
}  

在这里插入图片描述


代码说明

  1. 结构体定义: 定义一个双链表节点结构体 Node,包含数据、指向下一个节点的指针和指向上一个节点的指针。
  2. 创建新节点: createNode 函数用于创建新节点并初始化它的值。
  3. 添加节点: append 函数在链表末尾添加新节点。
  4. 打印链表: printList 函数遍历链表并打印每个节点的数据。
  5. 删除节点: deleteNode 函数查找指定值的节点,找到后删除它,并调整链表的指针。
  6. 主函数: 在 main 函数中创建链表、打印原始链表、输入要删除的数据并最终打印删除后的链表。

更新

好的,下面是对原始双链表程序的进一步优化,实现了以下功能:

  1. 用户可以输入链表的初始值。
  2. 程序会在一个无限循环中,用户可以选择删除节点或在特定位置添加节点,直到用户选择退出。
  3. 提供更多选择功能,例如在头部、尾部或特定位置插入节点。
#include <stdio.h>
#include <stdlib.h>// 定义双链表节点
typedef struct Node {int data;struct Node* next;struct Node* prev;
} Node;// 创建新节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;newNode->prev = NULL;return newNode;
}// 在链表末尾添加节点
void append(Node** head_ref, int new_data) {Node* new_node = createNode(new_data);Node* last = *head_ref;if (*head_ref == NULL) {*head_ref = new_node;return;}while (last->next != NULL)last = last->next;last->next = new_node;new_node->prev = last;
}// 在链表头部添加节点
void prepend(Node** head_ref, int new_data) {Node* new_node = createNode(new_data);new_node->next = *head_ref;if (*head_ref != NULL)(*head_ref)->prev = new_node;*head_ref = new_node;
}// 在指定位置插入节点
void insertAfter(Node* prev_node, int new_data) {if (prev_node == NULL) {printf("前一个节点不可为NULL。\n");return;}Node* new_node = createNode(new_data);new_node->next = prev_node->next;prev_node->next = new_node;new_node->prev = prev_node;if (new_node->next != NULL)new_node->next->prev = new_node;
}// 打印链表
void printList(Node* node) {while (node != NULL) {printf("%d ", node->data);node = node->next;}printf("\n");
}// 查找并删除节点
void deleteNode(Node** head_ref, int key) {Node* temp = *head_ref;// 如果头节点包含要删除的值if (temp != NULL && temp->data == key) {*head_ref = temp->next;if (*head_ref != NULL)(*head_ref)->prev = NULL;free(temp);return;}// 查找要删除的节点while (temp != NULL && temp->data != key)temp = temp->next;// 如果未找到要删除的节点if (temp == NULL) {printf("未找到数据为 %d 的节点。\n", key);return;}// 更改指针以删除节点if (temp->next != NULL)temp->next->prev = temp->prev;if (temp->prev != NULL)temp->prev->next = temp->next;free(temp);
}// 主函数
int main() {Node* head = NULL;int initialValue, numOfNodes;// 用户输入链表的初始值printf("请输入链表的节点数量: ");scanf("%d", &numOfNodes);for (int i = 0; i < numOfNodes; i++) {printf("请输入第 %d 个值: ", i + 1);scanf("%d", &initialValue);append(&head, initialValue);}while (1) {printf("\n当前链表: ");printList(head);int choice, data, pos;printf("选择操作:1. 删除节点 2. 在头部添加节点 3. 在尾部添加节点 4. 在指定位置插入节点 5. 退出\n");printf("请输入你的选择: ");scanf("%d", &choice);switch (choice) {case 1:printf("请输入要删除的数据: ");scanf("%d", &data);deleteNode(&head, data);break;case 2:printf("请输入要添加到头部的数据: ");scanf("%d", &data);prepend(&head, data);break;case 3:printf("请输入要添加到尾部的数据: ");scanf("%d", &data);append(&head, data);break;case 4:printf("请输入要插入的位置(从1开始): ");scanf("%d", &pos);printf("请输入要插入的数据: ");scanf("%d", &data);{Node* current = head;for (int i = 1; current != NULL && i < pos; i++) {current = current->next;}// 如果是插入头部if (pos == 1) {prepend(&head, data);} else if (current != NULL) {insertAfter(current->prev, data);} else {printf("插入位置超出链表范围,添加到尾部。\n");append(&head, data);}}break;case 5:printf("退出程序。\n");// 释放链表内存while (head != NULL) {Node* temp = head;head = head->next;free(temp);}return 0;default:printf("无效选择,请重试。\n");break;}}return 0;
}

在这里插入图片描述

新增功能说明:

  1. 用户输入初始值: 程序请求用户输入链表节点的数量和每个节点的数据,生成初始链表。
  2. 无限循环: 使用 while(1) 创建一个无限循环,让用户选择各种操作。
  3. 选择操作: 用户可以选择删除节点、在链表头部或尾部添加节点、在指定位置插入节点或退出程序。
  4. 内存释放: 在退出程序时,所有分配的内存会被释放,避免内存泄漏。

操作提示:

  • 用户可以根据提示输入数据和选择执行的操作。
  • 增加了在特定位置插入节点的功能,如果插入位置超出链表范围,则会将数据添加到尾部。

这个程序现在更加灵活,能够处理多种链表操作,便于用户进行动态的数据管理。


http://www.ppmy.cn/ops/120047.html

相关文章

Java ERP管理系统源码解析:微服务架构实践Spring Cloud Alibaba与Spring Boot

在当今数字化浪潮的推动下&#xff0c;企业对于高效、稳定且易于扩展的管理系统需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的鸿鹄ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、S…

微信小程序——婚礼邀请函

目的 1.掌握微信小程序的开发技术&#xff0c;包括页面布局、交互设计、数据存储等。 2.学会运用微信小程序的各种组件和 API&#xff0c;实现个性化的婚礼邀请函功能。 3.通过制作婚礼邀请函小程序&#xff0c;提升创意设计和用户体验优化的能力。 4.了解如何在小程序中整…

【Router】路由功能之MAC地址过滤(MAC Filter)功能介绍及实现

MAC地址过滤(MAC Filter) MAC 地址过滤是一种网络安全技术,通过在网络设备(如路由器)上设置规则,允许或阻止特定 MAC 地址的设备连接到网络。其主要作用是增强网络的安全性,防止未经授权的设备接入网络。 MAC Filter工作原理 MAC 地址过滤的工作原理是根据设备…

excel 填充内容的公式

多行填充快捷方式&#xff1a; 使用“CtrlEnter”键&#xff0c;这样所有选中的空单元格前就会自动添加上相同的字符。 对于多行填充&#xff0c;Excel提供了几个快捷键来提高工作效率&#xff1a; “CtrlR”用于向右填充数据。如果你在表格的某一列输入了数据&#xff0c;选…

广联达 Linkworks办公OA Service.asmx接口存在信息泄露漏洞

漏洞描述 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑&#xff0c;提供一百余款基于“端云大数据”产品/服务&#xff0c;提供产业大数据、产业新金融等增值服务的数字建筑平台服务商。广联达OA存在信息泄露漏洞&#xff0c;由于某些接口没有鉴权&#xff0c…

C语言日志类库 zlog 使用指南(第三章 “Hello World“)

第三章 “Hello World” 3.1 构建和安装 zlog 1. 下载 zlog&#xff1a; 链接: [https://github.com/HardySimpson/zlog/archive/latest-stable.tar.gz] 2. 解压并进入目录&#xff1a; $ tar -zxvf zlog-latest-stable.tar.gz $ cd zlog-latest-stable/3. 编译并安装&…

Arduino UNO R3自学笔记18 之 Arduino的外部中断、定时中断介绍及应用

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;上篇写了为啥要用中断&#xff0c;这篇具体展开写Arduino中断相关的知识。 温习&#xff1a;单片机在执行程序时&#xff0c;发生一些其它紧急的事情&…

【分布式微服务云原生】gRPC vs RPC:深入探索远程过程调用的现代与经典

摘要 在分布式系统的世界里&#xff0c;gRPC和RPC是两个耳熟能详的术语&#xff0c;但它们之间有何区别和联系&#xff1f;本文将深入探讨gRPC和RPC的概念、关键特性、以及它们在现代软件开发中的应用。你将了解到gRPC如何作为RPC的一种实现&#xff0c;提供高性能的跨语言远程…