数据结构(C语言)实验-单链表

不带头结点的单链表

链表倒置

假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,
请设计算法函数linklist reverse1(linklist  head)和
void reverse2(linklist *head)将不带头结点的单链表head就地倒置,
使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。

linklist reverse1(linklist head)
{linklist p;linklist new_list;new_list = NULL;p = NULL;while (head == NULL || head->next == NULL) {return head;}while (head != NULL) {p = head;head = head->next;p->next = new_list;// p结点插入到链表头部new_list = p;// 更新new_list指针在链表头部}return new_list;
}

插入结点

假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。

linklist insert(linklist head ,datatype x)
{linklist p = head;if(p->info > x) { //判断表头linklist dummy = (linklist*)malloc(sizeof(linklist));dummy->info = x;dummy->next = head;return dummy;}while(p->next) {if (p->next->info > x) {linklist dummy = (linklist*)malloc(sizeof(linklist));dummy->info = x;dummy->next = p->next;p->next = dummy;return head;} else {p = p->next;}}linklist dummy = (linklist*)malloc(sizeof(linklist));dummy->info = x;dummy->next = NULL;p->next = dummy;return head;
}

附录 

#include <stdio.h>
#include <stdlib.h> 
/**************************************/
/* 链表实现的头文件,文件名slnklist.h */
/**************************************/typedef int datatype;typedef struct link_node{datatype info;struct link_node *next;}node;
typedef node *linklist;/**********************************/
/*函数名称:creatbystack() 			 */
/*函数功能:头插法建立单链表            */
/**********************************/
linklist creatbystack()
{  linklist  head,s;datatype x;head=NULL;printf("请输入若干整数序列:\n");scanf("%d",&x);while (x!=0)		/*以0结束输入*/{   s=(linklist)malloc(sizeof(node));  /*生成待插入结点*/s->info=x;s->next=head;			/*将新结点插入到链表最前面*/head=s;scanf("%d",&x);}return head;				/*返回建立的单链表*/
}
/**********************************/
/*函数名称:creatbyqueue() 			 */
/*函数功能:尾插法建立单链表            */
/**********************************/
linklist creatbyqueue()
{linklist head,r,s;datatype x;head=r=NULL;printf("请输入若干整数序列:\n");scanf("%d",&x);while (x!=0) /*以0结束输入*/{    s=(linklist)malloc(sizeof(node));s->info=x;if (head==NULL)		/*将新结点插入到链表最后面*/head=s;elser->next=s;r=s;scanf("%d",&x);}if (r)  r->next=NULL;return head;					/*返回建立的单链表*/
}
/**********************************/
/*函数名称:print()		 			 */
/*函数功能:输出不带头结点的单链表      */
/**********************************/
void print(linklist head)
{   linklist p;int i=0;p=head;printf("List is:\n");while(p){printf("%5d",p->info);p=p->next;i++;if (i%10==0) printf("\n");}printf("\n");
}
/**********************************/
/*函数名称:delList()		 		 */
/*函数功能:释放不带头结点的单链表      */
/**********************************/
void delList(linklist head)
{ linklist p=head;while (p){ head=p->next;free(p);p=head;}
}

带头结点的单链表

链表倒置

假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数void reverse(linklist  head),
将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。

//例如,h->1->2->3,h->1 2->3,h->2->1 3,h->3->2->1
void reverse(linklist head)
{//没有元素或者一个元素直接returnif (head->next == NULL || head->next->next == NULL) {return;}linklist pre,cur;cur = head->next;pre = NULL;//断开头结点head->next = NULL;while(cur != NULL) {//更新pre和cur指针pre = cur;cur = cur->next;//头插法插入节点pre->next = head->next;head->next = pre;}
}

插入结点

假设带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。

void  insert(linklist head ,datatype x)
{linklist pre,cur,dummy;//创建插入的节点dummydummy = (linklist*)malloc(sizeof(linklist));dummy->info = x;pre = head;cur = head->next;//找到x插入的位置while (cur && cur->info < x) {pre = cur;cur = cur->next;}//插入dummy结点pre->next = dummy;dummy->next = cur;return head;
}

查找倒数第k个结点的地址

编写一个程序,用尽可能快的方法返回带头结点单链表中倒数第k个结点的地址,如果不存在,则返回NULL。

linklist  search(linklist head,int k)
{/*linklist p,x;p = head->next;x = p;int cnt = 0;//计算链表的长度while (x) {cnt++;x = x->next;}//找不到结点if (k > cnt) {return NULL;}//找到倒数第k个结点for (int i = 0; i < cnt - k; i++) {p = p->next;}return p;*/linklist fast = head;linklist slow = head;//flag用于记录k是否不在范围之内int flag = 0;//快指针走k步for(int i = 0; i < k && fast; i++) {fast = fast->next;}//慢指针快指针一起走while(fast) {fast = fast->next;slow = slow->next;flag = 1;}return flag == 1 ? slow : NULL;
}

多项式相加

#include <stdlib.h>
#include <stdio.h>typedef struct node
{       int coef;        /*系数*/int expn;       /*指数*/struct node *next;
}listnode;        //多项式存储结构typedef listnode *linklist;
void delList(linklist head);/*函数名称: creat()函数功能:建立多项式存储结构,并且多项式在表中按所在项的指数递增存放*/
linklist creat()            //建立多项式存储结构,
{linklist head,s,p,pre,r;int coef;int expn;head=(linklist)malloc(sizeof(listnode));    /*生成头结点*/head->next=NULL;printf("请输入多项式,每一项只需输入系数,指数(当输入的系数为0时结束输入):\n");scanf("%d",&coef);         //输入系数scanf("%d",&expn);        //输入指数p = head;while (coef!=0)       //请在此处填上适当的代码{s = (linklist)malloc(sizeof(listnode)); //插入新结点s->coef = coef;s->expn = expn;s->next = NULL;head->next = s; //head指针后移head = s;scanf("%d",&coef);         //输入系数scanf("%d",&expn);        //输入指数//printf("while");}return p;
}void print(linklist head) //输出多项式{linklist p;p=head->next;while (p){   printf("%d(X)",p->coef);printf("%d    ",p->expn);p=p->next;}printf("\n");}/*函数名称: add()函数功能:多项式相加入口参数:a与b是存储多项式的带头结点单链表,并且多项式在表中按所在项的指数递增存放*/
linklist add(linklist a,linklist b)  //请将本函数补充完整
{linklist pa,pb,c,pc,r;pa = a;pb = b;c = (linklist)malloc(sizeof(listnode));c->next = NULL;pc = c;while (pa && pb) {if (pa->expn == pb->expn) {r = (linklist)malloc(sizeof(listnode));//两个多项式相加r->expn = pa->expn;r->coef = pa->coef + pb->coef;r->next = NULL;//插入进入c链表pc->next = r;pc = r;//双指针后移pa = pa->next;pb = pb->next;} else if (pa->expn < pb->expn) {r = (linklist)malloc(sizeof(listnode));//将a结点插入进cr->expn = pa->expn;r->coef = pa->coef;r->next = NULL;pc->next = r;pc = r;//pa后移pa = pa->next;} else {r = (linklist)malloc(sizeof(listnode));//将b结点插入进cr->expn = pb->expn;r->coef = pb->coef;r->next = NULL;pc->next = r;pc = r;//pb后移pb = pb->next;}}pc->next = pa ? pa : pb;return c->next;
}int main(){linklist a,b,c;a=creat();printf("多项式a为:");print(a);b=creat();printf("多项式b为:");print(b);c=add(a,b);printf("两个多项式的和为:\n");print(c);delList(c);return 0;}/***************************************/
/*函数名称:delList()		 	                	 */
/*函数功能:释放带头结点的单链表      */
/***************************************/
void delList(linklist head)
{ linklist p=head;while (p){ head=p->next;free(p);p=head;}
}

附录

#include <stdio.h>
#include <stdlib.h>
/****************************************/
/* 链表实现的头文件,文件名slnklist.h */
/****************************************/typedef int datatype;typedef struct link_node{datatype info;struct link_node *next;}node;
typedef node *linklist;
/**********************************************/
/*函数名称:creatbystack() 		       	                     */
/*函数功能:头插法建立带头结点的单链表    */
/**********************************************/
linklist creatbystack()
{linklist  head,s;datatype x;head=(linklist)malloc(sizeof(node));head->next=NULL;printf("请输入整数序列(空格分开,以0结束):\n");scanf("%d",&x);while (x!=0){s=(linklist)malloc(sizeof(node));s->info=x;s->next=head->next;head->next=s;scanf("%d",&x);}return head;
}
/***************************************/
/*函数名称:creatbyqueue() 			   */
/*函数功能:尾插法建立带头结点的单链表 */
/***************************************/
linklist creatbyqueue()
{linklist head,r,s;datatype x;head=r=(linklist)malloc(sizeof(node));head->next=NULL;printf("请输入整数序列(空格分开,以0结束):\n");scanf("%d",&x);while (x!=0){s=(linklist)malloc(sizeof(node));s->info=x;r->next=s;r=s;scanf("%d",&x);}r->next=NULL;return head;
}
/**********************************/
/*函数名称:print()		 			 */
/*函数功能:输出带头结点的单链表      */
/**********************************/
void print(linklist head)
{linklist p;int i=0;p=head->next;printf("List is:\n");while(p){printf("%7d",p->info);i++;if (i%10==0)    printf("\n");p=p->next;}printf("\n");}/******************************************/
/*函数名称:creatLink() 			      */
/*函数功能:从文件中读入n个数据构成单链表 */
/******************************************/
linklist creatLink(char *f, int n)
{FILE *fp;int i;linklist s,head,r;head=r=(linklist)malloc(sizeof(node));head->next=NULL;fp=fopen(f,"r");if (fp==NULL)return head;else{for (i=0;i<n;i++){s=(linklist)malloc(sizeof(node));fscanf(fp,"%d",&(s->info));r->next=s;r=s;}r->next=NULL;fclose(fp);return head;}
}/*函数名称:writetofile函数功能:将链表内容存入文件f
*/
void writetofile(linklist head, char *f)
{FILE *fp;linklist p;int i=0;fp=fopen(f,"w");if (fp!=NULL){p=head->next;fprintf(fp,"%s","List is:\n");while(p){fprintf(fp,"%7d",p->info);i++;if (i%10==0)    fprintf(fp,"%c",'\n');p=p->next;}fprintf(fp,"%c",'\n');fclose(fp);}else    printf("创建文件失败!");}/**********************************/
/*函数名称:delList()		 		 */
/*函数功能:释放带头结点的单链表      */
/**********************************/
void delList(linklist head)
{ linklist p=head;while (p){ head=p->next;free(p);p=head;}
}

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

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

相关文章

Postman模拟上传文件

如图&#xff0c;在F12抓到的上传文件的请求 那要在postman上模拟这种上传&#xff0c;怎么操作呢&#xff0c;如图&#xff0c;选中【Select File】选取文件上传即可

统一消息分发中心设计

背景 我们核心业务中订单完成时&#xff0c;需要完成后续的连带业务&#xff0c;扣件库存库存、增加积分、通知商家等。 如下图的架构&#xff1a; 这样设计出来导致我们的核心业务和其他业务耦合&#xff0c;每次新增连带业务或者去掉连带业务都需要修改核心业务。 一方面&…

32 Feign性能优化

2.3.Feign使用优化 Feign底层发起http请求&#xff0c;依赖于其它的框架。其底层客户端实现包括&#xff1a; •URLConnection&#xff1a;默认实现&#xff0c;不支持连接池 •Apache HttpClient &#xff1a;支持连接池 •OKHttp&#xff1a;支持连接池 因此提高Feign的…

0062【Edabit ★☆☆☆☆☆】Arrow Functions

0062【Edabit ★☆☆☆☆☆】Arrow Functions closures higher_order_functions language_fundamentals logic Instructions In the Code tab you will find code that is missing a single character in order to pass the tests. However, your goal is to submit a functi…

竞赛选题 深度学习疲劳检测 驾驶行为检测 - python opencv cnn

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习加…

【tgowt】更新thirdparty

更新完毕后是这样的 之前有过构建但是不能用在owt-p2p项目中,会有崩溃? 【tgowt】cmake转ninja vs构建现在好像都更新到108了 submodule比较麻烦 只修改这里的还不行:一旦git submodule init 后,再改这里的似乎晚了?如果能成功clone就有生成 还必须要改这里的 折腾好几次才…

前端面试系列之工程化篇

如果对前端八股文感兴趣&#xff0c;可以留意公重号&#xff1a;码农补给站&#xff0c;总有你要的干货。 前端工程化 Webpack 概念 本质上&#xff0c;webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个…

供暖系统如何实现数据远程采集?贝锐蒲公英高效实现智慧运维

山西某企业专注于暖通领域&#xff0c;坚持为城市集中供热行业和楼宇中央空调行业提供全面、专业的“智慧冷暖”解决方案。基于我国供热行业的管理现状&#xff0c;企业成功研发并推出了可将能源供应、管理与信息化、自动化相融合的ICS-DH供热节能管理系统。 但是&#xff0c;由…

openGauss学习笔记-119 openGauss 数据库管理-设置数据库审计-设置文件权限安全策略

文章目录 openGauss学习笔记-119 openGauss 数据库管理-设置数据库审计-设置文件权限安全策略119.1 背景信息119.2 数据库程序目录及文件权限119.3 建议 openGauss学习笔记-119 openGauss 数据库管理-设置数据库审计-设置文件权限安全策略 119.1 背景信息 数据库在安装过程中…

PLC开放式以太网通信网络状态查看工具netstat

在进行PLC的开放式以太网通信时,为了查看网络状态我们可以利用ping这个强有力的工具,还可以使用netstat这个工具。 博途PLC开放式以太网通信 UDP通信 博途PLC 1200/1500PLC开放式以太网通信TSEND_C通信(UDP)_RXXW_Dor的博客-CSDN博客文章浏览阅读1.7k次。开放式TSEND_C通信…

微信小程序和H5之间互相跳转、互相传值

微信小程序和内嵌 H5 之间来回跳转&#xff0c;来回交互。 1 微信小程序跳转 H5 1.2. web-view 微信小程序官方提供了 web-view 组件来实现微信小程序跳转到 H5 页面&#xff0c;实现的方式也很简单&#xff0c;具体实现方式如下&#xff1a; 1、新建一个页面用来单独存放 we…

SSL证书申请安全审核失败?

随着HTTPS普及&#xff0c;申请安装使用SSL证书成为了我们的必备项。但这个SSL证书申请过程中&#xff0c;遇到问题也是不少。今天我们来浅了解一下SSL证书为什么会出现安全审核失败&#xff1f; SSL证书申请会出现安全审核失败的情况可能是以下原因&#xff1a; 域名验证不通…

安卓常见设计模式14------单例模式(Kotlin版)

1. W1 是什么&#xff0c;什么是单例模式&#xff1f;​ 单例模式属于创建型模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。单例模式的核心思想是限制类的实例化&#xff0c;使得系统中只有一个共享的实例。 2. W2 为什么&#…

华为防火墙二层透明模式下双机热备主备备份配置(两端为交换机)

这种模式只能是主备备份模式&#xff0c;不能是负载分担&#xff0c;因为会有环路。 故障切换是&#xff0c;如果主故障&#xff0c;主设备所有接口全都会down状态&#xff0c;然后再up一次&#xff0c;用于改变mac转发表。 FW1 hrp enable hrp interface GigabitEthernet1/0…

国际上有影响的10位城市设计师 优漫教育

这是以一篇网络文章为主并综合一些资料整理的“国际上有影响的10位城市设计师”。这10位城市设计师生活的时间跨度非常大&#xff0c;他们中间除了雅各布斯以外&#xff0c;都是建筑师、城市规划师或景观设计师&#xff0c;或有相关的教育背景&#xff0c;从一个侧面反映了城市…

【数据结构】——栈、队列简答题模板

目录 一、栈&#xff08;一&#xff09;栈的基本概念&#xff08;二&#xff09;栈的应用&#xff08;三&#xff09;栈的代码实现&#xff08;四&#xff09;递归算法&#xff08;五&#xff09;栈与队列的区别 二、队列&#xff08;一&#xff09;队列的基本概念&#xff08;…

前端各种资源集合

文章目录 前端资料集&#x1f44d;在线工具字体图标SVG|PNG|ICO素材压缩工具特效素材插画素材检查测试 前端资料集 &#x1f44d;在线工具 CSS3贝塞尔曲线动画生成CSS Gradient渐变色生成SVG在线制作工具一个轻量级在线编辑器在线生成雪碧图在线JSON查看removebg在线抠图uupo…

python实现炒股自动化,个人账户无门槛量化交易的开始

本篇作为系列教程的引子&#xff0c;对股票量化程序化自动交易感兴趣的朋友可以关注我&#xff0c;现在只是个粗略计划&#xff0c;后续会根据需要重新调整&#xff0c;并陆续添加内容。 股票量化程序化自动交易接口 很多人在找股票个人账户实现程序化自动交易的接口&#xff0…

Coding面试题之手写线程池

原理图 JDK线程池原理 实现代码 1.线程类&#xff08;PoolThread&#xff09; 这个类用于执行任务队列中的任务。 public class PoolThread extends Thread {private final Queue<Runnable> taskQueue;private boolean isStopped false;private long lastTaskTime …

传奇世界如何添加新的装备

大家应该都知道传世所有的装备列表都是保存在StdItems.DB 物品数据库中&#xff0c;各种装备的属性等信息也是在这个数据库中来定义的&#xff0c;比如某个武器的攻击力&#xff0c;佩戴要求&#xff0c;外观都是在这个数据库中定义。 然后我们要修改或添加新的装备&#xff0…