实现单链表的各种基本运算

合集下载

数据结构习题及答案与实验指导(线性表)2

数据结构习题及答案与实验指导(线性表)2

第2章线性表线性表是一种最基本、最常用的数据结构,它有两种存储结构——顺序表和链表。

本章主要介绍线性表的定义、表示和基本运算的实现。

重点讨论了线性表的存储结构,以及在顺序、链式两种存储结构上基本运算的实现。

重点提示:●线性表的逻辑结构特征●线性表的顺序存储和链式存储两种存储结构的特点●在两种存储结构下基本操作的实现2-1 重点难点指导2-1-1 相关术语1.线性表线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,通常记为:(a1,a2,…,a n),其中n为表长,n=0时称为空表。

要点:一种逻辑结构,其数据元素属于相同数据类型,之间的关系是线性关系。

2.顺序表顺序存储的线性表。

要点:按线性表中的元素的逻辑顺序依次存放在地址连续的存储单元里,其存储特点:用物理上的相邻实现逻辑上的相邻。

3.链表用链表存储的线性表。

要点:链表是通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的,对每个结点的地址是否连续没有要求。

4.单链表每个结点除了数据域外还有一个指向其后继的指针域。

要点:通常将每个元素的值和其直接后继的地址作为一个结点,通过每个结点中指向后继结点的指针表示线性表的逻辑结构。

5.头指针要点:头指针是一个指针变量,里面存放的是链表中首结点的地址,并以此来标识一个链表。

如链表H,链表L等,表示链表中第一个结点的地址存放在指针变量H、L中。

通常用头指针来惟一标识一个链表。

6.头结点要点:附加在第一个元素结点之前的一个结点,头指针指向头结点。

当该链表表示一个非空的线性表时,头结点的指针域指向第一个元素结点;为空表时,该指针域为空。

7.头结点的作用要点:其作用有两个,一是使对空表和非空表的处理得到统一;二是在链表的第一个位置上的操作和在其他位置上的操作一致,无需特殊处理。

2-1-2 线性表的顺序存储1.顺序表顺序存储的线性表称为顺序表。

其特点是:用一组地址连续的存储单元来依次存放线性表的数据元素,因此数据元素的逻辑顺序和物理次序一致(这是顺序存储的核心所在)。

数据结构 学生成绩管理

数据结构  学生成绩管理

/*学生成绩管理学生成绩管理是学校教务管理的重要组成部分,其处理信息量很大,本实验是对学生的成绩管理作一个简单的模拟,用菜单选择操作方式完成下列功能(1)学生成绩;(2)查询学生成绩;(3)插入学生成绩;(4)删除学生成绩。

单链表的各种操作,包括单链表的建立、结点的查找、插入、删除等基本运算。

本题实质是建立学生成绩单链表,每条信息由学号、姓名与成绩组成,即链表中每个结点由4个域组成,分别为:学号、姓名、成绩、存放下一个结点地址的next域。

要求完成的四项功能可写成四个函数,登记学生成绩对应建立学生单链表的功能,后三个功能分别对应单链表的查询、插入与删除三大基本操作。

该系统中的数据采用线性表中的链式存储结构即单链表来存储,用结构体类型定义每个学生记录,故该单链表中每个结点的结构可描述为*/#define MAXLEN 100/*typedef struct node{ int num; //学号char name[MAXLEN]; //姓名float score; //成绩struct node *next;}linklist;*///【参考程序】// 头文件hh.h的内容#include<iostream>using namespace std;//#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define MAXLEN 100#define ERROR 0typedef struct node{ int num;char name[MAXLEN];int score;struct node *next;}list;// 头文件creat.h的内容//#include"hh.h"list *create(){ list *head,*p,*r;int i,n;head=(list *)malloc(sizeof(list));head->next=ERROR;r=head;printf("请输入学生人数:\n");scanf("%d",&n);for(i=1;i<=n;i++){ p=(list *)malloc(sizeof(list));printf("输入学生的学号:\n"); scanf("%d",&p->num);printf("输入学生的姓名:\n");scanf("%s",p->name);printf("输入学生的成绩:\n");scanf("%d",&p->score);p->next=ERROR;r->next=p;r=r->next;}return(head);}// 以下是头文件insert.h的内容list *insert(list *h){list *p,*q,*r,*head;head=h;r=h;p=h->next;// 下面构造一个学生的信息q=(list *)malloc(sizeof(list));printf("输入待插入学生的学号:\n"); scanf("%d",&q->num);printf("输入姓名:\n");scanf("%s",q->name);printf("输入成绩:\n");scanf("%d",&q->score);q->next=ERROR;// 找到链表的表尾结点while(p!=ERROR){ r=p;p=p->next;}//将新结点插入到表尾r->next=q;r=r->next;return(head);}// 以下是头文件find.h的内容void find(list *h){int k;list *p;p=h->next;printf("输入要查找学生的学号:\n");scanf("%d",&k);while(p && p->num!=k)p=p->next;if(p){ printf("学号\t姓名\t成绩\n");printf("%d\t%s\t%d\n",p->num,p->name,p->score); }elseprintf("没找到!\n");}// 以下是头文件del.h的内容list *del(list *h){ int k;list *p,*q;q=h;p=h->next;printf("请输入待删除学生的学号:\n");scanf("%d",&k);while(p && p->num!=k){ q=p;p=p->next;}if(p){q->next=p->next;free(p);}elseprintf("没有这个学生成绩,无法删除!\n");return(h);}// 以下是头文件output.h的内容void output(list *h){list *p;p=h->next;while(p!=ERROR){printf("学号\t姓名\t成绩\t\n");printf("%d\t%s\t%d\n",p->num,p->name,p->score);p=p->next;}}int main(){ list *p;int k; //控制循环的标志while(1){printf(" -----------------------------------\n"); printf(" | 学生成绩管理 |\n"); printf(" |__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|\n"); printf(" | 1. 登记成绩 |\n"); printf(" | 2. 查询成绩 |\n"); printf(" | 3. 插入成绩 |\n"); printf(" | 4. 删除成绩 |\n"); printf(" | 5. 输出所有学生成绩 |\n"); printf(" | 0. 退出程序 |\n"); printf(" ------------------------------------\n"); printf(" 请输入你的选择:\n");scanf("%d",&k);switch(k){ case 1: p=create();break;case 2: find(p);break;case 3: p=insert(p);break;case 4: p=del(p);break;case 5: output(p);break;case 0: exit(0);default: printf("选择错误,重新开始!\n");}} //while}。

约瑟夫环问题

约瑟夫环问题

第2章实验(2学时)1.验证性实验(满分80)以下两个验证性实验都做(1)顺序表●顺序表的C语言描述●基本运算的算法——置空表、求表的长度、取结点、定位运算、插入运算、删除运算、建立顺序表、输出顺序表(2)链表●单链表的C语言描述●基本运算的算法——置空表、求表的长度、取结点、定位运算、插入运算、删除运算、建立不带头结点的单链表(头插入法建表)、建立带头结点的单链表(尾插入法建表),输出带头结点的单链表2.设计性实验(满分90)集合的交、并和差运算的实现(1)问题描述用有序单链表表示集合,实现集合的交、并和差运算。

(2)基本要求●对集合中的元素,用有序单链表进行存储。

●实现交、并、差运算时,不另外申请存储空间。

●充分利用单链表的有序性,算法有较好的时间性能。

(3)设计思想首先,建立两个带头结点的有序单链表表示集合A和B。

须注意的是:利用头插入法建立有序单链表,实参数组应该是降序排列。

其次,根据集合的运算规则,利用单链表的有序性,设计交、并和差运算。

●根据集合的运算规则,集合A∩B中包含所有既属于集合A又属于集合B的元素。

因此,须查找单链表A和B中的相同元素并保留在单链表A中。

●根据集合的运算规则,集合A∪B中包含所有或属于集合A或属于集合B的元素。

因此,对单链表B中的每个元素x,在单链表A中进行查找,若不存在和x相同的元素,则将该结点插入到单链表A中。

●根据集合的运算规则,集合A-B中包含所有属于集合A而不属于集合B的元素。

因此,对单链表B中的每个元素x,在单链表A中进行查找,若存在和x相同的元素,则将该结点从单链表A中删除。

(4)思考:如果表示结合的单链表是无序的,应如何实现集合的交、并和差运算?3.综合性实验(满分100)约瑟夫环问题(1)问题描述设有编号为1,2,…,n的n(n>0)个人围成一个圈,每个人持有一个密码m。

从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。

02331自考数据结构 第二章 线性表

02331自考数据结构 第二章 线性表

return ;
}
if ( L -> length >= ListSize ){
printf (" overflow ");
return ;
}
for ( j - L -> length -1; j >= i -1; j --)
L ->data [ j +1]= L -> data [ j ]; //从最后一个元素开始逐一后移
线性表的基本运算
上述运算仅仅是线性表的基本运算,不是其全部运 算。因为对不同问题的线性表,所需要的运算可能不同。 因此,对于实际问题中涉及其他更为复杂的运算,可用 基本运算的组合来实现。
线性表的基本运算
【例2.1】假设有两个线性表 LA 和 LB 分别表示两个 集合 A 和 B ,现要求一个新集合 A = A∪B 。
线性表的逻辑定义
数据元素“一个接一个的排列”的关系叫做 线性关系,线性关系的特点是“一对一”,在计 算机领域用“线性表”来描述这种关系。另外, 在一个线性表中数据元素的类型是相同的,或者 说线性表是由同一类型的数据元素构成的,如学 生情况信息表是一个线性表,表中数据元素的类 型为学生类型;一个字符串也是一个线性表:表 中数据元素的类型为字符型等等。
,
a2
i
,…,
ai-1
,
a.aii++1.1 , .…,
an
)
an
线性表n的-1逻辑结an构和存储结构都发…生了相应的变化, 与插入运算相反,插…入是向后移动元素,而删除运算则
是向前移M动AX元-1 素,除非i=n 时直接删除终端元素,不需移
动元素。
删除前
删除后

第3章线性表的链式存储

第3章线性表的链式存储
L
(a) 空循环链表
L
a1
a2
...
an
(b) 非空循环链表
3.1.3 双向链表
在单链表结点中只有一个指向其后继结点的next 指针域,而找其前驱则只能从该链表的头指针开始,顺 着各结点的next指针域进行查找,也就是说找后继的时 间复杂度是O(1),找前驱的时间复杂度是O(n)。如果也 希望找前驱像后继那样快,则只能付出空间的代价:每 个结点再加一个指向前驱的指针域prior,结点的结构修 改为下图,这样链表中有两个方向不同的链,用这种结 点组成的链表称为双向链表。
1.带头结点的单链表 2.不带头结点的单链表
3.3.3 单链表插入操作的实现
单链表的插入操作是指在表的第i个位置结点处插入 一个值为data的新结点。插入操作需要从单链表的第一个结 点开始遍历,直到找到第i个位置的结点。插入操作分为在 结点之前插入的前插操作和在结点之后插入的后插操作。
1.前插操作 2.后插操作
2.整数型单链表算法
3.不带头结点的单链表算法
3.2.2 尾插法单链表的创建实现
用头插法实现单链表的创建,比较简单,但读入的 数据元素的顺序与生成的链表中元素的顺序是相反的。若希 望两者次序一致,则用尾插法创建单链表。为了快速找到新 结点插入到链表的尾部位置,所以需加入一个尾指针r用来 始终指向链表中的尾结点。初始状态:头指针L和尾指针r均 为空,把各数据元素按顺序依次读入,申请结点,将新结点 插入到r所指结点的后面,然后r指向新结点,直到读入结束 标志为止。
3.2.2 尾插法单链表的创建实现
L
插入P前的尾指针 插入P后的尾指针
r
3
4
P1
x^
2
3.3 单链表运算的实现

201560140140--袁若飞--实验1:线性表地基本操作及其应用

201560140140--袁若飞--实验1:线性表地基本操作及其应用

实用标准 文档大全 数据结构 实验1:线性表的基本操作及其应用

班级:RB软工移151 学号:201560140140 姓名:袁若飞实用标准

文档大全 实验一 线性表 一、实验目的 1、帮助读者复习C++语言程序设计中的知识。 2、熟悉线性表的逻辑结构。 3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。

二、实验内容 本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,题目一、二是必做题。题目三、题目四选作。

三、实验准备知识 1、请简述线性表的基本特性和线性表的几种基本操作的机制 ①答:线性表的基本特性是:对线性表中某个元素ai来说,称其前面的元素ai-1为ai的直接前驱,称其后前面的元素ai+1为ai的直接后继。显然,线性表中每个元素最多有一个直接前驱和一个直接后继。 ②答:线性表的几种基本操作的机制有六个: (1)初始化线性表 initial_List(L)——建立线性表的初始结构,即建空表。这也是各种结构都可能要用的运算。 (2)求表长度 List_length(L)——即求表中的元素个数。 (3)按序号取元素 get_element(L,i)——取出表中序号为i的元素 。 (4)按值查询 List_locate(L,x)——取出指定值为x的元素,若存在该元素,则返回其地址;否则,返回一个能指示其不存在的地址值或标记。 (5)插入元素 List_insert(L,i,x)——在表L的第i个位置上插入值为x的元素。显然,若表中的元素个数为n,则插入序号i应满足1<=i<=n+1。 (6)删除元素 List_delete(L,i)——删除表L中序号为i的元素,显然,待删除元素的序号应满足1<=i<=n。 2、掌握线性表的逻辑结构。

3、掌握线性表的链式存储结构。 4、熟练掌握线性表的插入、删除等操作。 实用标准 文档大全 四、实验内容 题目一:顺序表的基本操作 [问题描述] 实现顺序表的建立、求长度,取元素、修改元素、插入、删除等基本操作。 [基本要求] (1)依次从键盘读入数据,建立顺序表; (2)输出顺序表中的数据元素; (3)求顺序表的长度; (4)根据指定条件能够取元素和修改元素; (5)实现在指定位置插入和删除元素的功能。

第3章 线性表及其存储结构

第3章 线性表及其存储结构

链式存储结构,既可用来表示线性结构, 也可用来表示非线性结构。线性表的链式存 储结构,称为线性链表。 对线性链表而言,它不要求逻辑上相邻的 元素在物理位置上也相邻。其存储单元既可 以是连续的,也可以是不连续的,甚至可以 零散分布在内存中的任何位置上。 通常,为了适应线性链表的存储,计算机 的存储空间被划分成一个一个的小块,每一 小块占若干字节,这些小块就是存储结点。 存储结点的结构,如图 3-2 所示。
在稍微复杂的线性表中,一个数据元素还 可以由若干个数据项组成。例如,某班的学 生情况登记表是一个复杂的线性表,表中每 一个学生的情况就组成了线性表中的每一个 元素,每一个数据元素包括学号、姓名、性 别、入学成绩4个数据项。
3.2线性表的顺序存储及其运算
3.2.1 线性表的顺序存储 线性表的顺序存储结构称为顺序表。
第3章 线性表及其存储结构
3.1线性表的基本 概念 3.2线性表的顺序 存储及运算 3.3线性表的链式 存储及运算
3.1 线性表的基本概念
线性表是由 n (n≥0)个数据元素 a1 ,a2 ,…,an 组成的一个有限序列。表中的每一个数据元 素,除了第一个外,有且只有一个前件;除 了最后一个外,有且只有一个后件。即线性 表或是一个空表或可以表示为:
(a1 ,a2 ,…,ai ,…,an)其中 ai(i=1,2,…,n) 是属于数据对象的元素,通常也称其为线性 表中的一个结点。
数据元素在线性表中的位置,只取决于它们 自己的序号 。 非空线性表的结构特征为: ① 有且只有一个根结点a1 ,它无前件;
② 有且只有一个终端结点an ,它无后件;
③ 除根结点与终端结点外,其他所有结点 有且只有一个前件,也有且只有一个后件。线 性表中结点的个数n称为线性表的长度。当 n=0时,称为空表。

数据结构实验复习

数据结构实验复习

实验一C语言数据类型的使用[实验目的]复习C语言的使用方法,特别是指针、结构体的内容,同时也为以后的各个实验做准备。

[实验内容及要求]1.建立一个简单链表(静态链表),它由3个学生数据的结点组成,每个结点包括学号和成绩。

输出各结点中的数据。

(根据题目完善程序)#define NULL 0struct student{long num;float score;struct student *next;} stu;typedef struct student stu;main (){ stu a,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{printf(“%ld%5.1f\n”, );/*输出学号和成绩*/p=p->next;}while( );}输出:2.建立一个动态链表,它由3个学生数据的结点组成,每个结点包括学号和成绩。

输出各结点中的数据。

#define NULL 0#define LEN sizeof(struct student)struct student{long num;float score;struct student *next;};int n;struct student *creat(void) /*尾插法建立链表*/{struct student *head;struct student *p1, *p2;n=0;p1=p2=(struct student *)malloc(sizeof(struct student));scanf(“%ld,%f”,&p1->num,&p1->score);head=NULL;while(p1->num!=0){n=n+1;if (n= =1)head=p1;else p2->next=p1;p2=p2->next ;p1=(struct student *)malloc(LEN);scanf(“%ld,%f”,&p1->num,&p1->score);}p2->next=NULL;return( head );}void print(struct student *head){struct student *p;printf(“\nNow,These %d records are:\n”,n);p=head;if(head!=NULL)do{printf(“%ld%5.1f\n”,p->num,p->score);}while(p!=NULL);}main(){struct student *head;printf(“input records:\n”);head=creat();print(head);}输入:输出:[思考题]1.将上题链表中学生的成绩从低到高排列输出,要求每行一个,包括学号和成绩。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现单链表的各种基本运算
单链表是一种重要的数据结构,在实际开发中应用广泛。

实现单链表的各种基本运算是数据结构学习的必备内容。

其中,包括单链表的创建、插入、删除、查找以及遍历等操作。

首先,单链表的创建需要定义单链表节点的结构体,并通过malloc函数动态分配节点内存。

然后,将各个节点通过指针相连,形成链表。

其次,单链表的插入操作可以在链表的任意位置插入新节点。

具体实现方式是,先通过遍历找到待插入节点的位置,然后将新节点插入到该位置前面即可。

再次,单链表的删除操作可以删除任意位置的节点。

具体实现方式是,先通过遍历找到待删除节点的位置,然后将其前一个节点的指针指向其后一个节点,再通过free函数释放该节点的内存即可。

另外,单链表的查找操作可以通过遍历实现。

对于有序链表,还可以采用二分查找法提高查找效率。

最后,单链表的遍历操作可以通过while循环遍历整个链表,依次输出每个节点的值。

总之,实现单链表的基本运算是数据结构学习中非常重要的一部分。

掌握了这些操作,可以为日后的开发工作打下坚实的基础。

- 1 -。

相关文档
最新文档