【C语言】数据结构C语言版 实验2 不带头结点的单链表
运行环境:Dev-C++
vs2013可能不能运行
首先新建一个头文件slnklist.h
#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;}
}
1.编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。 并构造测试用例进行测试。
/*编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。
并构造测试用例进行测试。
*/
/**********************************/
/*文件名称:lab2_01.c */
/**********************************/#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delx(linklist head,datatype x)
{linklist p = head,pre=NULL;//一定要初始化pre=NULL while(p&&p->info!=x){pre = p;p = p->next;}if(p){if(!pre){head = head->next;}else {pre->next = p->next;free(p);}}return head;}int main()
{ datatype x;linklist head;head=creatbyqueue(); /*尾插入法建立单链表*/print(head);printf("请输入要删除的值:");scanf("%d",&x);head=delx(head,x); /*删除单链表的第一个值为x的结点*/print(head);delList(head); /*释放单链表空间*/return 0;
}
2.假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储, 请设计算法函数linklist reverse1(linklist head)和 void reverse2(linklist *head)将不带头结点的单链表head就地倒置, 使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
/**********************************/
/*文件名称:lab2_02.c */
/**********************************/
/*
假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,
请设计算法函数linklist reverse1(linklist head)和
void reverse2(linklist *head)将不带头结点的单链表head就地倒置,
使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
*/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist reverse1(linklist head)
{linklist p,q;p=head;head = NULL;while(p) //核心{q = p->next;p->next = head;head=p;p=q;}return head;
}
void reverse2(linklist *head) //不返回值,那就从指针上下手
{linklist p,q;p=*head;*head = NULL;while(p){q = p->next;p->next = *head;*head=p;p=q;}
}int main()
{ datatype x;linklist head;head=creatbystack(); /*头插入法建立单链表*/print(head); /*输出原链表*/head= reverse1(head); /*倒置单链表*/print(head); /*输出倒置后的链表*/reverse2(&head); /*倒置单链表*/print(head);delList(head);return 0;
}
3.假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x), 将值为x的结点插入到链表head中,并保持链表有序性。 分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
/*
假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
*/
/**********************************/
/*文件名称:lab2_03.c */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist insert(linklist head ,datatype x)
{linklist pre,p,s;s = (linklist)malloc(sizeof(node));s->info = x;p = head;pre=NULL;while(p&&p->infonext; } if(!pre) //插在表头 {s->next = head;head = s;}else{ //插在中间或者末尾 pre->next = s; s->next = p;}return head;}
int main()
{ datatype x;linklist head;printf("输入一组升序排列的整数:\n");head=creatbyqueue(); /*尾插入法建立单链表*/print(head);printf("请输入要插入的值:");scanf("%d",&x);head=insert(head,x); /*将输入的值插入到单链表适当位置*/print(head);delList(head);return 0;
}
4.编写算法函数linklist delallx(linklist head, int x),删除不带头结点单链表head中所有值为x的结点。
/*
编写算法函数linklist delallx(linklist head, int x),删除不带头结点单链表head中所有值为x的结点。
*/
/**********************************/
/*文件名称:lab2_04.c */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delallx(linklist head,int x)
{linklist p,t;while(head)//如果要删除的是第一个 {if(head->info==x){p=head;head=head->next; free(p);//回收p } else {break;}}if(head)//如果删除的不是第一个 {p=head;while(p->next){if(p->next->info==x){t=p->next;p->next=p->next->next;free(t);} else {p=p->next;}} }return head;
}
int main()
{ datatype x;linklist head;head=creatbyqueue(); /*尾插入法建立单链表*/print(head);printf("请输入要删除的值:");scanf("%d",&x);head=delallx(head,x);print(head);delList(head);return 0;
}
【C语言】数据结构C语言版 实验2 不带头结点的单链表相关推荐
- [数据结构-严蔚敏版]P37定义一个带头结点的线性链表
大家如果发现代码有错误,麻烦评论告知一下!!! 代码我已经发现存在部分错误,等有时间我再进行修正.目前存在错误:mergeList_L函数有问题! 代码如下: #include <iostrea ...
- 2.3 带头结点的单链表:理论+编程实战(C语言详细)
1.顺序存储:线性表/栈/队列:理论+C语言实现–详细 2.1 链式存储概述 和 2.2 线性表的链式存储–单链表(C语言详细实现) 文章目录 2.3 带头结点的单链表 1. 带头结点的单链表基本概念 ...
- C语言实现不带头结点的单链表逆置的三种方法
C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...
- C语言不带头结点的单链表
C语言不带头结点的单链表 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>typedef st ...
- 不带头结点的单链表------C语言实现
1 /****************************************************/ 3 File name:no_head_link.c4 Author:SimonKly ...
- 数据结构练习:运用单链表实现图书管理系统(c/c++)(内含带头结点的单链表的基本操作)
数据结构练习:运用单链表实现图书管理系统 正文 注意 部分功能运行展示 所包含头文件及结构体的定义 自定义函数 主函数 完整代码 结束语 正文 本程序使用带头节点的单链表存储结构实现,共有六个基本功能 ...
- 不带头结点的单链表------C语言实现(带注释)
#include <stdio.h> #include <stdlib.h> /*next 英文词的意思 是 "下一个". 链表里 用于 指向下一个节点的指 ...
- 【数据结构】带头结点的单链表
文章目录 一.单链表的概念 二.结构体声明: 三.函数 1.购买节点 2.释放节点 3.单链表的初始化 4.判空函数 5.获取单链表有效值个数 6.按数据查询(返回含有此数据节点的前驱) 7.按数据查 ...
- 【C语言】数据结构C语言版 实验3 带头结点的单链表
slnklist.h #include <stdio.h> #include <stdlib.h> /************************************* ...
最新文章
- php 菜谱 源码,基于php的菜谱大全api调用代码实例
- 【未来可能用到】关于模型的100个问答-part1
- 开源|如何开发一个高性能的redis cluster proxy?
- linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt
- 七十九、TodoList示例 深入Redux的工作流
- Katy Perry - E.T.
- logstash 吞吐量优化_1002-谈谈ELK日志分析平台的性能优化理念
- 如何从字符串生成流?
- js案例:动态生成表格
- Matlab绘制直方图,横坐标间设置等间距的空格
- 基于JavaWeb的小区物业管理系统的设计与实现
- 【190222】VC++ 社区视频监控系统源代码
- Nginx Window假死状态
- 数论 —— 逆元与同余式定理
- UVM学习笔记(四)sequence与sequencer
- 源支付3.1版本全开源版+店员监控软件+手机监控APP源码
- 冬天到了,分享两款雪花特效代码
- 是不是顺子【C语言保姆级讲解】
- 关于WirelessKey的一些说明
- 高防服务器对ip有影响吗,高防服务器与高防IP的区别和联系