C数据结构与算法——单链表 应用

实验任务

(1) 掌握单链表结构及其 C 语言实现;
(2) 掌握插入、删除等基本算法;
(3) 掌握单链表的基本应用(将两个有序线性表合并为一个有序表)。

实验内容

  • 使用 C 语言实现单链表的类型定义与算法函数;
  • 编写 main()函数,合理调用函数实现以下功能:
    • 创建 2 个单链表 L1、L2(带头结点,用于存储表长);
    • 初始化 L1 数据并显示(斐波拉契序列前 2-11 项):1、2、、…、89;
    • 随机产生 L2 数据 10 个:
      • 第 1 个数为 4,其后每个数字比其前趋随机增加1~9,显示L2 内容
      • 附加分 20:再用洗牌算法随机打乱(10 次)L2 中的数据,显示L2的内容
    • 将 L2 中的结点按从前往后的顺序一个一个有序合并到L1 中(即每次都将L2中的首元结点摘下链入 L1 中正确位置,完成后 L2 成为空表),显示L1的内容;
    • 随机删除 L1 中第 1~20 个元素,显示 L1 的内容;
    • 随机产生 1 个[1, 100]之间的数字插入到 L1 中并保持有序,显示L1的内容;
    • 销毁 L1 和 L2,即将所有结点空间归还系统。

实验源码

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>#define NUM_L1 10
#define NUM_L2 10typedef enum {ERROR,OK
} status;typedef enum {FALSE,TRUE
} boolean;typedef int ElemType;typedef struct LNode { // 链表的定义ElemType data;struct LNode *next;
} LNode, *LinkList;status InitList(LinkList list); // 链表的初始化void PrintList(LinkList list); // 打印链表void Fibonacci(LinkList list, int length); // 创建 L1void RandomNumber(LinkList list, int num); // 创建 L2void knuthShuffle(LinkList list, int num); // 洗牌算法(交换值的方式)void swapInt(ElemType *elem1, ElemType *elem2); // 辅助洗牌算法 交换元素ElemType *GetElem(LinkList list, int num); // 辅助洗牌算法 取值void BubbleSort(LinkList list); // 冒泡排序(值交换)void MergeList_L(LinkList list1, LinkList list2); // L2 合并到 L1 并保持有序status DeleteElem(LinkList list, int i); // 随机删除 L1 中的第i个元素status InsertElem(LinkList list, ElemType randElem); // 随机插入一个元素到 L1中 并保持有序boolean IsEmpty(LinkList list); // 判断链表是否为空 [辅助插入]status InitList(LinkList list) {list = (LinkList) malloc(sizeof(LNode));if (list == NULL) {return ERROR;}list->next = NULL;list->data = 0;return OK;
}void PrintList(LinkList list) {LNode *temp;int count = 0;printf("->{%2d}", list->data);for (temp = list->next; temp != NULL; temp = temp->next) {printf("->(%2d)", temp->data);if (++count % 10 == 0 && count != list->data) {printf("\n        ");}}printf("\n");
}void Fibonacci(LinkList list, int length) {int num1 = 0;int num2 = 1;LNode *temp, *tail;tail = list;for (int i = 1; i <= length; i++) {temp = (LinkList) malloc(sizeof(LNode));if (i % 2 != 0) {num1 += num2;temp->data = num1;} else {num2 += num1;temp->data = num2;}tail->next = temp;tail = temp;}tail->next = NULL;list->data = length;
}void RandomNumber(LinkList list, int num) {LNode *temp, *tail;ElemType tElem; // 临时存储数据 tempElemtail = list;for (int i = 0; i < num; i++) {temp = (LinkList) malloc(sizeof(LNode));if (i != 0) {temp->data = tElem + rand() % 9 + 1;} else {temp->data = 4;}tElem = temp->data;tail->next = temp;tail = temp;}tail->next = NULL;list->data = num;
}void knuthShuffle(LinkList list, int num) {for (int i = num - 1; i >= 1; i--) {swapInt(GetElem(list, i), GetElem(list, (rand() % (i + 1))));}
}void swapInt(ElemType *elem1, ElemType *elem2) {ElemType temp;temp = *elem1;*elem1 = *elem2;*elem2 = temp;
}ElemType *GetElem(LinkList list, int num) {LNode *temp = list->next;int j = 1;while (temp && j < num) {temp = temp->next;++j;}return &(temp->data);
}void BubbleSort(LinkList list) {LNode *pA, *pB, *pTail = NULL;LNode *pHead = list->next;while (pTail != pHead) {pB = pHead;int count = -1;while (pB->next != pTail) {pA = pB->next;if (pA->data < pB->data) {ElemType temp = pA->data;pA->data = pB->data;pB->data = temp;count++;}pB = pB->next;}if (count == -1) {return;}pTail = pB;}
}void MergeList_L(LinkList list1, LinkList list2) {BubbleSort(list2);LNode *pL1, *pL2, *pL3;pL1 = list1->next;pL2 = list2->next;pL3 = list1;while (pL1 && pL2) {if (pL1->data <= pL2->data) {pL3->next = pL1;pL3 = pL1;pL1 = pL1->next;} else {pL3->next = pL2;pL3 = pL2;pL2 = pL2->next;}}pL3->next = pL1 ? pL1 : pL2;list1->data = list1->data + list2->data;
}status DeleteElem(LinkList list, int i) {LNode *pL = list, *temp;int j = 1;while (pL->next && j < i) {pL = pL->next;++j;}while (!(pL->next) || j > i) {return ERROR;}temp = pL->next;pL->next = temp->next;free(temp);list->data--;return OK;
}status InsertElem(LinkList list, ElemType randElem) {if (IsEmpty(list) || randElem < 1 || randElem > 100) {return ERROR;}LNode *temp;temp = (LinkList) malloc(sizeof(LNode));temp->next = NULL;temp->data = randElem;LNode *pL = list->next;while (pL->next != NULL) {pL = pL->next;}pL->next = temp;list->data++;BubbleSort(list);return OK;
}boolean IsEmpty(LinkList list) {if (list->next == NULL) {return TRUE;} else {return FALSE;}
}/*** <h2>单链表实验</h2>* return 0*/
int main() {LNode L1, L2;srand(time(NULL));printf("=========================== 单链表编程实践 ===========================\n");if (InitList(&L1) == OK) {printf("【单链表L1已生成】\n");Fibonacci(&L1, NUM_L1);printf("L1");PrintList(&L1);}if (InitList(&L2) == OK) {printf("【单链表L2已生成】\n");RandomNumber(&L2, NUM_L2);printf("L2");PrintList(&L2);}printf("【Knuth洗牌算法随机打乱L2】\n");knuthShuffle(&L2, NUM_L2);printf("L2");PrintList(&L2);printf("【单链表L2有序合并到L1】\n");MergeList_L(&L1, &L2);printf("L1");PrintList(&L1);int randNum_10 = rand() % 10 + 1;printf("【随机删除L1中第%d个元素】\n", randNum_10);DeleteElem(&L1, randNum_10);printf("L1");PrintList(&L1);ElemType randNum_100 = rand() % 100 + 1;printf("【随机产生%d插入到L1中】\n", randNum_100);InsertElem(&L1, randNum_100);printf("L1");PrintList(&L1);return 0;
}

实验结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/14209.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式应用之监控Zabbix

分布式应用之监控Zabbix 一、什么是Zabbix? ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存…

解决Ruoyi单体版本集成Echarts多图表时在Tab模式下不展示问题

目录 背景 一、Tab拆分后无法展示 1、环境简介 2、原始报表功能说明 3、tab切分遇到的问题 二、问题分析及解决 1、问题分析 2、问题解决 3、初始化时图表渲染 4、Tab切换时重渲 总结 背景 最近在使用ruoyi的单体化版本进行Echarts多图表展示时遇到一个问题&#xff0c;r…

【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

发现问题的契机&#xff1a; 学习异步通知的时候&#xff0c;自己实现一个功能&#xff1a;按键控制蜂鸣器&#xff0c;同时LED灯在闪烁 结果&#xff1a;LED好像也同时被按键控制了 最后调试结果发现&#xff1a; 应用层的sleep被驱动层的kill_fasync打断&#xff0c;所以sle…

JavaScript 将对象数组按字母顺序排序

原文链接&#xff1a;JavaScript 将对象数组按字母顺序排序 这里给出三种解决方案&#xff1a; 1.if条件语句 sort() 2.localeCompare() sort() 3.Collator() sort() sort 用法 语法 array.sort(compareFunction)参数值 参数描述compareFunction可选。定义替代排序顺序…

基于matlab使用PointNet深度学习进行点云分类(附源码)

一、前言 此示例演示如何训练 PointNet 网络以进行点云分类。 点云数据由各种传感器获取&#xff0c;例如激光雷达、雷达和深度摄像头。这些传感器捕获场景中物体的3D位置信息&#xff0c;这对于自动驾驶和增强现实中的许多应用非常有用。例如&#xff0c;区分车辆和行人对于…

【Django学习】(十一)APIView_请求与响应_GenericAPIView

继承DRF中APIView之后&#xff0c;那么当前视图就具备了认证、授权、限流等功能 继承DRF中APIView之后&#xff0c;每一个实例方法中的request为Request对象 Request类拓展了Django中的HttpRequest类&#xff0c;具备很多额外优秀的功能Request类与HttpRequest类中的所有功能兼…

03-MySQL-基础篇-SQL之DDL语句

SQL之DDL语句 前言DDL数据库操作表操作查询操作数据类型案例修改删除 前言 本篇来学习下SQL中的DDL语句 DDL 全称Data Definition Language&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段) 数据库操作 查询所有数据库 sh…

【Qt QML入门】第一个Quick应用

运行结果&#xff1a; 打开Qt Creator&#xff0c;创建一个Qt Quick Qpplication&#xff0c;IDE为我们创建一个应用工程&#xff0c;其中包含如下文件&#xff1a; .pro工程文件&#xff0c;我们通过它来打开整个工程&#xff1a; QT quick# You can make your code fail to…

基于simulink识别彩色视频序列中的交通警告标志

一、前言 此示例演示如何识别彩色视频序列中的交通警告标志&#xff0c;如“停止”、“请勿进入”和“让行”。 二、模型 下图显示了交通警告标志识别模型&#xff1a; 三、交通警告标志模板 该示例使用两组模板 - 一组用于检测&#xff0c;另一组用于识别。 为了节省计算…

java的RSA加密解密示例

RSA算法是一种非对称加密算法&#xff0c;公钥和私钥都可以用于加密和解密操作。在RSA算法中&#xff0c;公钥用于加密数据&#xff0c;私钥用于解密数据。 具体来说&#xff0c;使用公钥加密的数据只能使用相应的私钥进行解密。而使用私钥加密的数据则可以使用相应的公钥进行…

【BUG历险记】vivado报错:binding vhdl entity ‘ xxxxx ‘does not have port ‘ xxxxx ‘解决方案

&#x1f3d4;【BUG历险记】vivado报错&#xff1a;binding vhdl entity xxxxx does not have port xxxxx 解决方案 问题描述 我在编写雷达的脉冲压缩仿真时&#xff0c;先例化了FFT和复数乘法器&#xff0c;并仿真验证通过了&#xff1b;再例化IFFT&#xff0c;结果仿真时…

最新抖音娱乐测评小程序源码 Thinkphp后端 抖音引流小程序

最新抖音娱乐测评小程序源码 thinkphp后端 抖音引流小程序 附搭建教程 测试环境 NginxPHP7.0MySQL5.6 网站运行目录设置为 /web 数据库配置文件 \source\application\database.php 后台登录地址 http://你的域名/index.php?s/admin/passport/login