用c语言写一个读入数据生成链表并处理的程序:⚫从上述input.ifo文件读入人员信息,正向建立线性表,使用循环链表方式存储;⚫输出线性表各结点的值和在线性表的位置值到屏幕;⚫键盘输入编号值S,在线性表中查找到编号为S的结点并输出结点的值,包括名字和随机编号(需要测试查找到和查找不到两种情况);⚫键盘输入位置值M,从线性表中1号结点开始向后报数,将报M的结点从线性表中删除,并输出该结点的编号和初始位置;(提示:可以将按位置删除函数改造成一个新的删除函数,删除的同时返回指向下一个结点的指针值、被删除结点的值;初始位置的值,可以考虑在建立循环链表时保存到结点内)⚫从刚才被删除人的下一个人开始重复上述步骤,直至最后只剩下一个人为止;⚫输出最后剩余一个人的编号和在线性表的初始位置。

时间: 2024-02-06 15:13:00 浏览: 28
以下是一份符合题目要求的C语言程序,具体实现过程中可能需要根据实际情况进行调整和修改: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_NAME_LEN 20 // 名字最大长度 #define MAX_PEOPLE_NUM 100 // 最大人数 // 定义链表节点结构 typedef struct node { char name[MAX_NAME_LEN]; // 名字 int id; // 编号 struct node* next; // 指向下一个节点的指针 } Node; // 创建循环链表 int createList(Node **head) { FILE *fp; if ((fp = fopen("input.ifo", "r")) == NULL) { printf("无法打开文件.\n"); return -1; } Node *p = (Node *)malloc(sizeof(Node)); // 创建节点p,保存节点数据 *head = p; int len = 0; while (fscanf(fp, "%s %d", p->name, &p->id) != EOF) { len++; p->next = (Node *)malloc(sizeof(Node)); p = p->next; } free(p); fclose(fp); p->next = *head; // 指向头节点,形成循环 return len; } // 输出链表节点的值和位置 void printList(Node *head) { Node *p = head; int i = 1; do { printf("位置:%d,名字:%s,编号:%d\n", i, p->name, p->id); p = p->next; i++; } while (p != head); } // 查找指定编号的节点 Node *searchById(Node *head, int id) { Node *p = head; do { if (p->id == id) { return p; } p = p->next; } while (p != head); return NULL; // 没有找到节点,返回NULL } // 删除指定位置的节点 Node *deleteByPos(Node *head, int pos, int *id, int *init_pos) { Node *p = head; Node *pre = NULL; int i = 1; while (i < pos) { pre = p; p = p->next; i++; } if (pre == NULL) { // 删除头节点 head = p->next; } else { pre->next = p->next; } *id = p->id; *init_pos = pos; free(p); return head; } int main() { Node *head = NULL; int len = createList(&head); if (len <= 0) { return 0; } printf("链表初始化完成,总共有%d个人:\n", len); printList(head); // 查找指定编号的节点 int search_id; printf("请输入要查找的编号:"); scanf("%d", &search_id); Node *search_node = searchById(head, search_id); if (search_node != NULL) { printf("编号为%d的人员信息:\n", search_id); printf("名字:%s,编号:%d\n", search_node->name, search_node->id); } else { printf("没有找到编号为%d的人员信息。\n", search_id); } // 删除指定位置的节点 int delete_pos, delete_id, init_pos; srand((unsigned int)time(NULL)); while (len > 1) { printf("请输入要删除的位置:"); scanf("%d", &delete_pos); if (delete_pos <= 0 || delete_pos > len) { printf("位置无效,请重新输入。\n"); continue; } head = deleteByPos(head, delete_pos, &delete_id, &init_pos); printf("编号为%d的人被删除,初始位置为%d。\n", delete_id, init_pos); printf("删除之后的链表:\n"); printList(head); len--; int count = rand() % (len - 1) + 1; printf("从%d号位置开始报数,报%d的人被删除。\n", init_pos, count); for (int i = 1; i < count; i++) { head = head->next; } Node *delete_node = head->next; head->next = delete_node->next; printf("编号为%d的人被删除。\n", delete_node->id); free(delete_node); printf("删除之后的链表:\n"); printList(head); len--; } printf("最后剩余一个人,编号为%d,初始位置为1。\n", head->id); free(head); return 0; } ``` 程序中使用了 createList 函数创建循环链表,printList 函数输出链表节点的值和位置,searchById 函数查找指定编号的节点,deleteByPos 函数删除指定位置的节点。在主函数中,先创建链表并输出链表节点的值和位置。然后让用户输入要查找的编号,查找对应的节点并输出节点的值。接下来进入循环,每次让用户输入要删除的位置,删除对应的节点并输出链表。然后按照题目要求从被删除节点的下一个节点开始,按照随机数报数,删除对应的节点并输出链表。当链表只剩下一个节点时,输出该节点的编号和初始位置。

相关推荐

最新推荐

recommend-type

C语言:一元多项式加减法运算(链表 附答案).docx

C语言链表的入门题,里面提供了两种思路供参考,用链表来实现一元多项式的加减法,并按照一定规律输出。也是练习链表和排序算法的一道小实验,初学链表的小伙伴可以参考参考噢
recommend-type

C语言数据结构实现链表逆序并输出

主要介绍了C语言数据结构实现链表逆序并输出的相关资料,需要的朋友可以参考下
recommend-type

C语言链表题目(附答案).docx

大一初学C语言时的期末作业,涉及到链表的建立和功能的实现,涉及指针、函数、动态结构建立等方面的知识,初学者可以参考参考尝试尝试哟!!!
recommend-type

数据结构实验报告之一元多项式求和(链表)报告2.doc

把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。 实验内容: 1.问题描述: 一元多项式求和——把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
recommend-type

node-v4.1.2-linux-armv7l.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
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

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

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