C语言 数据结构 实验二 线性表的链式存储及其操作
C语言 数据结构 实验二 线性表的链式存储及其操作
实验项目:线性表的链表实现:遍历、插入、删除、翻转
实验类型: 基础性
【指导思想】
用链表存储线性表,实现线性表的基本操作。
【实验目的及要求】
1、 复习C语言的指针的定义、链表的使用;
2、 理解线性表的属性;
3、 实践线性表的链式实现方法以及相关的操作。
4、 要求:提交实验报告,附源程序
涉及的知识点:
- 线性表的逻辑属性、运算
- 带表头的单链表的操作:定义、输入、输出、链表内容的翻转
- 元素/链表的操作:元素的插入、删除
【实验内容】
1.单链表的基本操作实践。实现单链表的建立(头插、尾插)、销毁、判空、输出、查找、插入、删除等功能,每个功能用一个函数实现。
(1)建立10个元素的链表list:{1,3,2,2,0,4,7,6,5,8},实现单链表的建立的基本操作。
(2)删除链表list:{1,3,2,9,0,4,7,6,5,8}的元素第一个值为2的元素,再在5号位置插入元素2,实现单链表的删除、插入的基本操作。
(3)对(2)步结果的单链表list:{1,3,9,0,2,4,7,6,5,8}的结点进行排序操作,得单链表list:{0,1,2,3,4,5,6,7,8,9}。
2. 基本算法实践。某非空带头结点单链表L中的元素为整数,实现将所有小于零的结点移到所有大于等于零的结点前面。例如L= {1,-3,-2,-9,0,4,7,-6,-5,8},输出新L的结果={-5, -6, -9,-2, -3,1, 0,4,7, 8}
【实验步骤和设计思想】
一、建立数组,并将题目中的数据输入,再将数组转化为链表进行后续操作
二、将大于零的结点通过尾结点放到链表的后面,再将小于零的结点通过头结点放到链表的前面
【程序清单】
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{ElemType data;struct LNode *next; //指向后继结点
} LinkNode; //声明单链表结点类型
//尾插
void CreateList1(LinkNode *&L,ElemType a[],int n)//建立链表,并将数组元素输入
{LinkNode *S,*R;L=(LinkNode *)malloc(sizeof(LinkNode));R=L;for(int i=0;i<n;i++){S=(LinkNode *)malloc(sizeof(LinkNode));S->data=a[i];R->next=S;R=S;}R->next=NULL;
}//头插法
void CreateListF(LinkNode *&L,ElemType a[],int n){LinkNode *s;L=(LinkNode *)malloc(sizeof(LinkNode));L->next=NULL;for(int i=0;i<n;i++){s=(LinkNode *)malloc(sizeof(LinkNode));s->data=a[i];s->next=L->next;L->next=s;}
}void DestroyList(LinkNode *&L)//销毁线性表
{LinkNode *pre=L,*p=L->next;while(p!=NULL){free(pre);pre=p;p=p->next;}free(pre);
}bool ListEmpty(LinkNode *&L)//判断线性表是否为空
{return(L->next==NULL);
}void DispList(LinkNode *L)//输出链表
{LinkNode *p=L->next;while(p!=NULL){printf("%d、",p->data);p=p->next;}printf("\n");
}int LocateElem(LinkNode *L,ElemType e)//按元素查找
{int i=1;LinkNode *p=L->next;while(p!=NULL&&p->data!=e){p=p->next;i++;}if(p==NULL)return (0);else{e=p->data;return (i);}
}bool ListInsert(LinkNode *&L,int i,ElemType e)//插入数据元素
{int j=0;LinkNode *p=L,*s;if(i<=0)return false;while(j<i-1&&p!=NULL){j++;p=p->next;}if(p==NULL)return false;else{s=(LinkNode *)malloc(sizeof(LinkNode));s->data=e;s->next=p->next;p->next=s;return true;}
}bool ListDalete(LinkNode *&L,int i,ElemType &e)//删除数据元素
{int j=0;LinkNode *p=L,*q;if(i<=0)return false;while(j<i&&p!=NULL){j++;p=p->next;}if(p==NULL)return false;else{q=p->next;if(q==NULL)return false;e=q->data;p->next=q->next;free(q);return true;}
}void SortList(LinkNode *&L);//声明函数
void Separation(LinkNode *L);//声明函数int main()
{LinkNode *L;printf("实验一:\n");int a[10]={1,3,2,2,0,4,7,6,5,8};//第一题第一问CreateList1(L,a,10);DispList(L);int b[10]={1,3,2,9,0,4,7,6,5,8},i,e;CreateList1(L,b,10);//第一题第二问删除第一个元素为二LocateElem(L,2);ListDalete(L,i,e);DispList(L);ListInsert(L,5,2);DispList(L);SortList(L);//第一题第三问DispList(L);printf("实验二:\n");int n;LinkNode *L2;printf("请规定单链表的长度:");scanf("%d",&n);int c[n];for(int i=0;i<n;i++){printf("请输入单链表的第%d个元素:",i+1);scanf("%d",&c[i]);}CreateList1(L,c,n);Separation(L);DispList(L);
}void SortList(LinkNode *&L)//插入排序
{int t=0;LinkNode *temp,*p;for ( temp = L->next->next; temp != NULL; temp = temp->next){for ( p = L; p->next != NULL; p = p->next){if (p->next->data > temp->data)//比较大小{t = temp->data;temp->data = p->next->data;p->next->data = t;}}}printf("排序之后\n");
}void Separation(LinkNode *L)
{LinkNode *p,*q,*i;p=L->next;L->next=NULL;i=L;//i为单链表L的尾结点while(p!=NULL){while(i->next!=NULL)i=i->next;//保证i为尾结点q=p->next;//q保存p结点后继结点的指针if(p->data>=0){//比0大或者相等的尾插法p->next=i->next;i->next=p;}else{//比0小的头插法p->next=L->next;L->next=p;}p=q;}
}
输出结果
欢迎大佬指正
C语言 数据结构 实验二 线性表的链式存储及其操作相关推荐
- 从零开始学数据结构和算法(二)线性表的链式存储结构
链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...
- 【数据结构】CH2 线性表的链式存储结构
目录 一.链表概述 1.相关定义 二.单链表 1.插入和删除节点的操作 (1)插入结点 (2)删除结点 2.建立单链表 (1)头插法 (2)尾插法 3.线性表基本运算在单链表中的实现 (1)初始化线性 ...
- 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...
- 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...
- 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表
文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
- 单链表(线性表的链式存储)---C语言版
目录 单链表(线性表的链式存储)---C语言版 一.相关说明 二.单链表的定义 三.单链表上具体操作的实现和时间复杂度 1.初始化表.构造一个空表. 2.根据数组创建单链表 3.求表长 4.插入操作. ...
- 双链表(线性表的链式存储)---C语言版
目录 双链表(线性表的链式存储)---C语言版 一.双链表的定义 二.双链表上具体操作的实现和时间复杂度 1.初始化表.构造一个空表. 2.根据数组创建双链表(头插法和尾插法) 3.插入操作.在表L中 ...
- Python 数据结构 之 线性表 的链式存储结构
用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明: Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...
- 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】
这是我的作业题,作业写完后再附到博客中,可能代码写得很烂.虽然是C语言写的,但是我在其中加入了C++的写法,例如cout.我懒得写printf的格式控制符,所以用cout来输出内容,这样我感觉简便多了 ...
最新文章
- Vue全局路由侦听beforeEach路由守卫附代码使用示例
- android .so文件详解以及兼容性
- 3.1 基础-抛小球
- java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.<init>()的问题解决
- safari only css hack,css hack将Safari和Chrome同时作为目标单独使用
- python单元测试框架作用_Python自动单元测试框架
- oracle数据库导出数据6,Oracle数据库导入导出方法汇总
- iOS应用开发环境准备
- 无基础学python能干什么-呼市学Python语言能干什么
- Linux网络服务_dhcp服务和dhcp中继服务
- Spring Boot打包成jar包
- 尝试造了个工具类库,名为 Diana
- atitit 好的企业文化确实可能降低企业短期效率但是必须的.docx
- paip.网站提示SESSION过期 登录过期 以及二次登录的问题
- python实现自适应中值滤波器
- 王道c语言,王道训练营-C语言-一
- python(1)汇率换算
- msxml3.dll 执行页内操作时的错误
- Exception in thread main java.util.UnknownFormatConversionException: Conversion = ';'
- Install Windows Vista Service Pack 2 (SP2)