严蔚敏版数据结构建立学生信息无头结点单链表C语言版

合集下载

清华严蔚敏《数据结构》的全部代码实现C语言 (1)

清华严蔚敏《数据结构》的全部代码实现C语言 (1)

/* (程序名) */#include<>#include<>#include<> /* malloc()等*/#include<> /* INT_MAX等*/#include<> /* EOF(=^Z或F6),NULL */#include<> /* atoi() */#include<> /* eof() */#include<> /* floor(),ceil(),abs() */#include<> /* exit() *//* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在中已定义OVERFLOW的值为3,故去掉此行*/ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE *//* 实现算法的程序*/#include""typedef int ElemType;#include""/* 线性表的动态分配顺序存储结构*/#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量*/#define LISTINCREMENT 2/* 线性表存储空间的分配增量*/typedef struct{ElemType*elem; /* 存储空间基址*/int length; /* 当前长度*/int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */}SqList;#include""/* 顺序表示的线性表(存储结构由定义)的基本操作(12个) */Status InitList(SqList*L) /* 算法*/{ /* 操作结果:构造一个空的顺序线性表*/(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!(*L).elem)exit(OVERFLOW); /* 存储分配失败*/(*L).length=0; /* 空表长度为0 */(*L).listsize=LIST_INIT_SIZE; /* 初始存储容量*/return OK;}Status DestroyList(SqList*L){ /* 初始条件:顺序线性表L已存在。

《数据结构(C语言版)》严蔚敏代码实现———链表

《数据结构(C语言版)》严蔚敏代码实现———链表

《数据结构(C语⾔版)》严蔚敏代码实现———链表⼀、前⾔哈喽,⼤家好~我是熊⼦q,我⼜来了!他来了他来了,他带着代码过来了!今天要分享的代码是链表!快快搬着⼩板凳!⼆、代码严奶奶的书中预定义了⼀些预定义常量和类型,⼤家可以 新建⼀个y.h⽂件粘贴以下内容, 然后再去复制代码哦。

y.h⽂件内容:/*** 严奶奶书中的预定义常量和类型**///函数结果状态代码#define TRUE 1 //成功#define FALSE 0 //失败#define OK 1 //成功#define ERROR 0 //错误#define INFEASIBLE -1 //不可实⾏#define OVERFLOW -2 //溢出//Status 是函数的类型,其值是函数结果状态代码typedef int Status;链表LinkList.cpp:#include "y.h"#include <iostream>#include <cstdlib>#include <cstdio>using namespace std;typedef int ElemType;/*** 严奶奶单链表的实现* by 熊⼦q 2021.2.1**/typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;//获取元素Status GetElem(LinkList L, int i, ElemType &e){//L为带头结点的单链表的头指针//当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORLNode *p = L->next; //p指向第⼀个结点int j = 1; //j为计数器while(p && j<i){ //寻找第i个位置p = p->next;++j;}if(!p || j>i) return ERROR; //第i个元素不存在e = p->data; //否则获取第i个元素return OK;}//插⼊元素,时间复杂度O(n)Status Insert(LinkList &L, int i, ElemType e){//在带头结点的单链表L中第i个位置之前插⼊元素eLNode *p = L;int j = 0;while(p && j<i-1){p = p->next;++j;}if(!p || j>i-1) return ERROR; //i⼩于1或者⼤于表长加1LNode *q = (LNode*)malloc(sizeof(LNode));q->data = e; //插⼊数据q->next = p->next;p->next = q;return OK;}//删除元素,时间复杂度O(n)Status ListDelete(LinkList &L, int i, ElemType e){//在带头结点的单链表L中,删除第i个元素,并由e返回其值LNode *p = L->next;int j = 1;while(p && j<i-1){p = p->next;++j;} //寻找i的前驱元素if(!(p->next) || j>i-1) return ERROR; //删除位置不合理,i元素不存在或 LNode *q = p->next; //删除第i个位置元素,并释放该结点 p->next = q->next;e = q->data;free(q);return OK;}//创建链表void CreateList(LinkList &L, int n){//逆序输⼊n个元素的值,建⽴带头结点的单链表LL = (LinkList)malloc(sizeof(LNode));L->next = NULL; //建⽴⼀个头结点printf("请输⼊数据:\n");for(int i=n;i>0;--i){LNode *p = (LNode*)malloc(sizeof(LNode));scanf("%d",&(p->data));p->next = L->next; L->next = p;}}//合并两个有序链表void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc){//已知单链表La和Lb的元素按值⾮递减排列//归并La和Lb得到新的单链表Lc,Lc的元素也按值⾮递减排列LNode *pa = La->next;LNode *pb = Lb->next;LNode *pc = La; //⽤La的头结点作为Lc的头结点Lc = pc;while(pa && pb){//取⼆者中较⼤值添加到Lc中if(pa->data > pb->data){//先添加该节点为pc的后继元素,然后pc和pa指针都后移pc->next = pa; pc = pc->next; pa = pa->next;}else{pc->next = pb; pc = pc->next; pb = pb->next;}}pc->next = pa? pa: pb; //插⼊剩余段free(Lb); //释放Lb的头结点}//输出单链表void Display(LinkList &L){LNode *p = L->next;printf("单链表的内容为:");while(p){printf("%d",p->data);if(p->next) printf("->");else printf("\n");p = p->next;}}int main(){LinkList l;CreateList(l, 5);Display(l);// printf("在第%d位插⼊%d",1,123);// Insert(l, 1, 123);// Display(l);int tmp;GetElem(l, 2, tmp);printf("%d",tmp);return 0;}三、运⾏截图四、附录如果你想看其他的代码,下⾯有链接哦:。

《数据结构》课后答案(C语言版)(严蔚敏_吴伟民著)

《数据结构》课后答案(C语言版)(严蔚敏_吴伟民著)

第1章 绪论1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。

解:数据是对客观事物的符号表示。

在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

存储结构是数据结构在计算机中的表示。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。

是对一般数据类型的扩展。

1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。

一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。

抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。

在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

1.3 设有数据结构(D,R),其中{}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r =试按图论中图的画法惯例画出其逻辑结构图。

解:1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。

解:ADT Complex{ 数据对象:D={r,i|r,i 为实数} 数据关系:R={<r,i>} 基本操作: InitComplex(&C,re,im)操作结果:构造一个复数C ,其实部和虚部分别为re 和imDestroyCmoplex(&C)操作结果:销毁复数CGet(C,k,&e)操作结果:用e返回复数C的第k元的值Put(&C,k,e)操作结果:改变复数C的第k元的值为eIsAscending(C)操作结果:如果复数C的两个元素按升序排列,则返回1,否则返回0IsDescending(C)操作结果:如果复数C的两个元素按降序排列,则返回1,否则返回0Max(C,&e)操作结果:用e返回复数C的两个元素中值较大的一个Min(C,&e)操作结果:用e返回复数C的两个元素中值较小的一个}ADT ComplexADT RationalNumber{数据对象:D={s,m|s,m为自然数,且m不为0}数据关系:R={<s,m>}基本操作:InitRationalNumber(&R,s,m)操作结果:构造一个有理数R,其分子和分母分别为s和m DestroyRationalNumber(&R)操作结果:销毁有理数RGet(R,k,&e)操作结果:用e返回有理数R的第k元的值Put(&R,k,e)操作结果:改变有理数R的第k元的值为eIsAscending(R)操作结果:若有理数R的两个元素按升序排列,则返回1,否则返回0IsDescending(R)操作结果:若有理数R的两个元素按降序排列,则返回1,否则返回0Max(R,&e)操作结果:用e返回有理数R的两个元素中值较大的一个Min(R,&e)操作结果:用e返回有理数R的两个元素中值较小的一个}ADT RationalNumber1.5 试画出与下列程序段等价的框图。

数据结构(C语言版)(严蔚敏)

数据结构(C语言版)(严蔚敏)

31
4、效率与低存储量需求 、
通常,效率指的是算法执行时间;存储量指的是 算法执行过程中所需要的最大存储空间。两者都 与问题的规模有关。
32
算法效率的衡量方法和准则
通常有两种衡量算法效率的方法: 事后统计法 缺点:1、必须执行程序 2、其它因素掩盖算法本质 事后分析估算法 和算法执行时间相关的因素: 1算法选用的策略 2、问题的规模 3、编写程序的语言 4、编译程序产生的机器代码的质量 5、计算机执行指令的速度
5
–例
书目自动检索系统
线性表
书目文件
书目卡片 001 高等数学 樊映川 002 理论力学 罗远祥 登录号: 003 高等数学 华罗庚 004 书名: 线性代数 栾汝书 …… 作者名: …… ……
按书名
高等数学 理论力学 线性代数 ……
S01 L01 S01 S02 ……
索引表
按分类号
分类号: 001, 003… … 樊映川 出版单位: 002, … … .. 华罗庚 出版时间: 004, … … 栾汝书 价格: … … ..
29
2、可读性 、
算法主要是为了人的阅读与交流,其次才是为计 算机执行。因此算法应该易于人的理解;另一方 面,晦涩难读的程序易于隐藏较多错误而难以调 试;
30
3.健壮性 健壮性
当输入的数据非法时,算法应当恰当地作出反映 或进行相应处理,而不是产生莫名奇妙的输出结 果。并且,处理出错的方法不应是中断程序的执 行,而应是返回一个表示错误或错误性质的值, 以便在更高的抽象层次上进行处理。
23
1.3 算法和算法分析
算法的概念和描述: 算法的概念和描述: 什么是算法? 什么是算法? 算法( 算法(Algorithm)是为了解决某类问题而规定的一 是为了解决某类问题而规定的一 个有限长的操作序列。 个有限长的操作序列。一个算法必须满足以下五 个重要特性: 个重要特性:

数据结构c语言版严蔚敏

数据结构c语言版严蔚敏
问题:必须先运行依据算法编制的程序;依赖软硬 件环境,容易掩盖算法本身的优劣;没有实际价值。 事前分析:求出该算法的一个时间界限函数。
与此相关的因素有: 依据算法选用何种策略; 问题的规模; 程序设计的语言; 编译程序所产生的机器代码的质量; 机器执行指令的速度; 撇开软硬件等有关部门因素,可以认为一个特定算
如何用数据形式描述问题?—即由问题抽象出一个 适当的数学模型; 问题所涉及的数据量大小及数据之间的关系; 如何在计算机中存储数据及体现数据之间的关系? 处理问题时需要对数据作何种运算? 所编写的程序的性能是否良好? 上面所列举的问题基本上由数据结构这门课程来回答。
1.1 数据结构及其概念
信息的表示和组织又直接关系到处理信息的程序的 效率。随着应用问题的不断复杂,导致信息量剧增与信 息范围的拓宽,使许多系统程序和应用程序的规模很大, 结构又相当复杂。因此,必须分析待处理问题中的对象 的特征及各对象之间存在的关系,这就是数据结构这门 课所要研究的问题。
计算机求解问题的一般步骤
编写解决实际问题的程序的一般过程:
编写解决实际问题的程序的一般过程如何用数据形式描述问题如何用数据形式描述问题即由问题抽象出一个适当的数学模型即由问题抽象出一个适当的数学模型问题所涉及的数据量大小及数据之间的关系问题所涉及的数据量大小及数据之间的关系如何在计算机中存储数据及体现数据之间的关系如何在计算机中存储数据及体现数据之间的关系处理问题时需要对数据作何种运算处理问题时需要对数据作何种运算所编写的程序的性能是否良好所编写的程序的性能是否良好算法与数据结构是计算机科学中的一门综合性专业基础课
O(㏒n) :对数时间阶 O(n㏒n) :线性对数时间阶
O (nk): k≥2 ,k次方时间阶 例1 两个n阶方阵的乘法

严蔚敏版数据结构题集(C语言版)完整答案

严蔚敏版数据结构题集(C语言版)完整答案

严蔚敏数据结构C 语言版答案详解第1章绪论1.1简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。

解:数据是对客观事物的符号表示。

在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

存储结构是数据结构在计算机中的表示。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。

是对一般数据类型的扩展。

1.2试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。

一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。

抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。

在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

1.3设有数据结构(D,R),其中{}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r =试按图论中图的画法惯例画出其逻辑结构图。

解:1.4试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。

解:ADTComplex{数据对象:D={r,i|r,i 为实数}数据关系:R={<r,i>}基本操作:InitComplex(&C,re,im) 操作结果:构造一个复数C ,其实部和虚部分别为re 和imDestroyCmoplex(&C) 操作结果:销毁复数CGet(C,k,&e)操作结果:用e 返回复数C 的第k 元的值Put(&C,k,e)操作结果:改变复数C 的第k 元的值为eIsAscending(C)操作结果:如果复数C 的两个元素按升序排列,则返回1,否则返回0IsDescending(C)操作结果:如果复数C 的两个元素按降序排列,则返回1,否则返回0 Max(C,&e)操作结果:用e返回复数C的两个元素中值较大的一个Min(C,&e)操作结果:用e返回复数C的两个元素中值较小的一个}ADTComplexADTRationalNumber{数据对象:D={s,m|s,m为自然数,且m不为0}数据关系:R={<s,m>}基本操作:InitRationalNumber(&R,s,m)操作结果:构造一个有理数R,其分子和分母分别为s和mDestroyRationalNumber(&R)操作结果:销毁有理数RGet(R,k,&e)操作结果:用e返回有理数R的第k元的值Put(&R,k,e)操作结果:改变有理数R的第k元的值为eIsAscending(R)操作结果:若有理数R的两个元素按升序排列,则返回1,否则返回0 IsDescending(R)操作结果:若有理数R的两个元素按降序排列,则返回1,否则返回0 Max(R,&e)操作结果:用e返回有理数R的两个元素中值较大的一个Min(R,&e)操作结果:用e返回有理数R的两个元素中值较小的一个}ADTRationalNumber1.5试画出与下列程序段等价的框图。

数据结构(C语言版)严蔚敏课后习题答案

数据结构(C语言版)严蔚敏课后习题答案

数据结构(C语言版)严蔚敏课后习题答案数据结构(C语言版)严蔚敏课后习题答案一、线性表1. 顺序表顺序表是一种存储结构,它将元素顺序存放在一块连续的存储区域中。

C语言中常用数组来实现顺序表。

以下是一些常见题目的解答:题目1:已知顺序表中存储了n个整数,请编写一个算法,将这个顺序表中的所有负数挑选出来,并将它们按照原有顺序存放在新的顺序表中。

解答:```#include <stdio.h>#define MAX_SIZE 100int main() {int A[MAX_SIZE], neg[MAX_SIZE];int n, i, j = 0;printf("Enter the number of elements: ");scanf("%d", &n);printf("Enter the elements: ");for (i = 0; i < n; i++) {scanf("%d", &A[i]);if (A[i] < 0) {neg[j] = A[i];j++;}}printf("Negative numbers: ");for (i = 0; i < j; i++) {printf("%d ", neg[i]);}return 0;}```题目2:假设顺序表A和B中的元素递增有序排列,编写一个算法合并这两个顺序表,并使合并后的顺序表仍然递增有序。

解答:```#include <stdio.h>#define MAX_SIZE 100int main() {int A[MAX_SIZE], B[MAX_SIZE], C[MAX_SIZE * 2]; int m, n, i, j, k;printf("Enter the number of elements in the first list: "); scanf("%d", &m);printf("Enter the elements in increasing order: ");for (i = 0; i < m; i++) {scanf("%d", &A[i]);C[i] = A[i];}printf("Enter the number of elements in the second list: "); scanf("%d", &n);printf("Enter the elements in increasing order: ");for (i = 0; i < n; i++) {scanf("%d", &B[i]);C[m + i] = B[i];}// Merge A and B into Ci = j = k = 0;while (i < m && j < n) { if (A[i] < B[j]) {C[k] = A[i];i++;} else {C[k] = B[j];j++;}k++;}while (i < m) {C[k] = A[i];i++;k++;}while (j < n) {C[k] = B[j];j++;k++;}printf("Merged list in increasing order: ");for (i = 0; i < m + n; i++) {printf("%d ", C[i]);}return 0;}```2. 链表链表是一种动态的数据结构,它通过结点之间的指针联系起来。

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构习题集答案(C语言版严蔚敏)第2章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

解:头指针是指向链表中第一个结点的指针。

首元结点是指链表中存储第一个数据元素的结点。

头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。

它可以对空表、非空表以及首元结点的操作进行统一处理。

2.2 填空题。

解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。

(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。

单链表中逻辑上相邻的元素的物理位置不一定紧邻。

(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。

(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。

2.3 在什么情况下用顺序表比链表好?解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。

2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。

解:2.5 画出执行下列各行语句后各指针及链表的示意图。

L=(LinkList)malloc(sizeof(LNode)); P=L;for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode));P=P->next; P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是__________________。

严蔚敏版数据结构建立学生信息无头结点单链表C语言版

严蔚敏版数据结构建立学生信息无头结点单链表C语言版
getchar();
for(;;)
{
printf("***********************菜单******************\n");
printf(" 1.建立空的单链表\n");
printf(" 2.建立单链表\n");
printf(" 3.销毁单链表\n");
printf(" 4.将单链表置为空表\n");
#include <stdio.h>
#include <malloc.h>
typedef struct Student/*定义学生类*/
{
int num;
char name[20];
char sex[2];
int age;
float grade;
}stu;
typedef struct LNode
{
stu data;
else
{
printf("cur_e的后驱为:\n");
printf("num:%d\nname:%s\nsex:%s\nage:%d\ngrade:%f\n",p->next->data.num,p->next->,p->next->data.sex,p->next->data.age,p->next->data.grade);
printf("请输入学生的数据,学号为零停止\n学号:\n");
scanf("%d",&p1->data.num);
printf("姓名:\n");

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解
目录
第 1 章 绪 论............................................................................................................................................... 4 1.1 复习笔记 .......................................................................................................................................... 4 1.2 强化习题详解 ................................................................................................................................... 7 1.3 考研真题与典型题详解 ................................................................................................................... 22
第 4 章 串................................................................................................................................................... 114 4.1 复习笔记 ....................................................................................................................................... 114 4.2 强化习题详解 ................................................................................................................................ 118 4.3 考研真题与典型题详解 ..................................................................................................................138

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构习题集答案(C语言版严蔚敏)第2章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

解:头指针是指向链表中第一个结点的指针。

首元结点是指链表中存储第一个数据元素的结点。

头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。

它可以对空表、非空表以及首元结点的操作进行统一处理。

2.2 填空题。

解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。

(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。

单链表中逻辑上相邻的元素的物理位置不一定紧邻。

(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。

(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。

2.3 在什么情况下用顺序表比链表好?解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。

2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。

解:2.5 画出执行下列各行语句后各指针及链表的示意图。

L=(LinkList)malloc(sizeof(LNode)); P=L;for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode));P=P->next; P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是__________________。

数据结构(C语言版)第2版习题答案解析-严蔚敏

数据结构(C语言版)第2版习题答案解析-严蔚敏

数据结构(C语言版)(第2版)课后习题答案李冬梅2015.3目录第1章绪论................................................................................................................... 第2章线性表 ............................................................................................................... 第3章栈和队列............................................................................................................ 第4章串、数组和广义表 ............................................................................................ 第5章树和二叉树........................................................................................................ 第6章图. (41)第7章查找 ................................................................................................................... 第8章排序...................................................................................................................第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

数据结构c语言版严蔚敏课后习题答案

数据结构c语言版严蔚敏课后习题答案

数据结构c语言版严蔚敏课后习题答案数据结构是计算机科学中非常重要的一门学科,它研究的是数据的组织、存储和管理方式。

而C语言作为一种广泛应用于系统编程和嵌入式开发的高级编程语言,与数据结构的学习息息相关。

本文将针对《数据结构(C语言版)》严蔚敏教材的课后习题提供一些答案,希望能够帮助读者更好地理解和掌握数据结构。

第一章:绪论在第一章中,主要介绍了数据结构的基本概念和基本术语。

课后习题主要是一些概念性的问题,例如数据结构与算法的关系、数据的逻辑结构和物理结构等。

这些问题的答案可以通过仔细阅读教材中的相关内容来得到。

第二章:线性表线性表是数据结构中最基本、最常用的一种结构。

课后习题主要涉及线性表的基本操作,如插入、删除、查找等。

这些问题的答案可以通过编写相应的C语言代码来实现。

第三章:栈和队列栈和队列是线性表的特殊形式,具有后进先出(LIFO)和先进先出(FIFO)的特点。

课后习题主要涉及栈和队列的基本操作,如进栈、出栈、入队、出队等。

这些问题的答案同样可以通过编写相应的C语言代码来实现。

第四章:串串是由零个或多个字符组成的有限序列,是一种特殊的线性表。

课后习题主要涉及串的模式匹配、串的替换等操作。

这些问题的答案可以通过使用C语言的字符串处理函数来实现。

第五章:数组和广义表数组是一种线性表的顺序存储结构,广义表是线性表的扩展。

课后习题主要涉及数组和广义表的创建、访问和操作等。

这些问题的答案可以通过编写相应的C语言代码来实现。

第六章:树树是一种非线性的数据结构,具有层次关系。

课后习题主要涉及树的遍历、节点的插入和删除等操作。

这些问题的答案可以通过使用C语言的指针和递归来实现。

第七章:图图是一种非线性的数据结构,由节点和边组成。

课后习题主要涉及图的遍历、最短路径、最小生成树等操作。

这些问题的答案可以通过使用C语言的图算法来实现。

通过以上的简要介绍,读者可以了解到《数据结构(C语言版)》严蔚敏教材的课后习题主要涵盖了线性表、栈和队列、串、数组和广义表、树、图等各个方面。

数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据结构( C语言版)(第 2版)课后习题答案李冬梅2015.3目录第 1 章绪论 (1)第 2 章线性表 (5)第 3 章栈和队列 (13)第 4 章串、数组和广义表 (26)第 5 章树和二叉树 (33)第 6 章图 (43)第 7 章查找 (54)第 8 章排序 (65)第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。

如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

在有些情况下,数据元素也称为元素、结点、记录等。

数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

例如,学生基本信息表中的学号、姓名、性别等都是数据项。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

例如:整数数据对象是集合N={0 ,± 1,± 2,, } ,字母字符数据对象是集合C={‘A’,‘B’, , ,‘Z’,‘ a’,‘ b’, , ,‘z ’} ,学生基本信息表也可是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

存储结构:数据对象在计算机中的存储表示,也称为物理结构。

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。

具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。

(完整word版)清华严蔚敏《数据结构》的全部代码实现C语言(word文档良心出品)

(完整word版)清华严蔚敏《数据结构》的全部代码实现C语言(word文档良心出品)

/* c1.h (程序名) */#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等*/#include<limits.h> /* INT_MAX等*/#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE *//* algo2-1.c 实现算法2.1的程序*/#include"c1.h"typedef int ElemType;#include"c2-1.h"/*c2-1.h 线性表的动态分配顺序存储结构*/#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量*/#define LISTINCREMENT 2/* 线性表存储空间的分配增量*/typedef struct{ElemType*elem; /* 存储空间基址*/int length; /* 当前长度*/int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */}SqList;#include"bo2-1.c"/* bo2-1.c 顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个) */ Status InitList(SqList*L) /* 算法2.3 */{ /* 操作结果:构造一个空的顺序线性表*/(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!(*L).elem)exit(OVERFLOW); /* 存储分配失败*/(*L).length=0; /* 空表长度为0 */(*L).listsize=LIST_INIT_SIZE; /* 初始存储容量*/return OK;}Status DestroyList(SqList*L){ /* 初始条件:顺序线性表L已存在。

C语言用栈存储学生信息,严蔚敏版数据结构建立学生信息顺序栈C语言版.doc

C语言用栈存储学生信息,严蔚敏版数据结构建立学生信息顺序栈C语言版.doc

C语⾔⽤栈存储学⽣信息,严蔚敏版数据结构建⽴学⽣信息顺序栈C语⾔版.doc#include#include#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct Student/*定义学⽣类 */{int num;char name[20];char sex[2];int age;float grade;}stu;typedef struct{stu *base;stu *top;int stacksize;}sqstack;sqstack InitStack()/*构造⼀个空栈*/{sqstack s;s.base=(stu*)malloc(STACK_INIT_SIZE*sizeof(stu));if(!s.base)printf("OVERFLOW\n");else{s.top=s.base;s.stacksize=STACK_INIT_SIZE;printf("OK\n");return s;}}void DestroyStack(sqstack *s)/*销毁栈*/{s->base=NULL;free(s->base);printf("OK\n");}void ClearStack(sqstack *s)/*将栈清空为空栈*/{s->top=s->base;printf("OK\n");}void StackEmpty(sqstack *s)/*若为空栈返回TRUE,否则返回FLASE*/ {if(s->base==NULL)printf("栈不存在.\n");else if(s->top==s->base)printf("TRUE\n");elseprintf("FLASE\n");}int StackLength(sqstack *s){if(s->base==NULL)return(-1);elsereturn(s->top-s->base);}stu GetTop(sqstack *s)/*返回栈顶元素 */{if(s->top==s->base)printf("ERROR\n");else{printf("OK\n");return *(s->top-1);}}void Push(sqstack *s)/*插⼊新元素*/{stu *newbase;if(s->top-s->base>=s->stacksize){newbase=(stu*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(stu)); if(!newbase)printf("OVERFLOW\n");else{s->top=s->base+s->stacksize;s->stacksize=s->stacksize+STACKINCREMENT;printf("请输⼊插⼊学⽣的数据\n学号:");scanf("%d",&s->top->num);printf("姓名:");scanf("%s",&s->top->name);printf("年龄:");scanf("%d",&s->top->age);printf("性别:");scanf("%s",&s->top->sex);printf("成绩:");scanf("%f",&s->top->grade);s->top++;}}else{printf("请输⼊插⼊学⽣的数据\n学号:");scanf("%d",&s->top->num);printf("姓名:");scanf("%s",&s->top->name);printf("年龄:");scanf("%d",&s->top->age);printf("性别:");scanf("%s",&s->top->sex);printf("成绩:");scanf("%f",&s->top->grade);s->top++;}}stu Pop(sqstack *s)/*删除栈顶元素,返回其值*/ {stu e;if(s->top==s->base)printf("ERROR\n");else{e=*(s->top-1相关资源:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p->next=q->next;
free(q);
printf("OK\n");
}
}
void ListTraverse_L(Linklist L,int visit(stu))/*对L中每个元素调用函数visit()*/
{
Linklist p=L->next;
while(p)
{
if(!visit(p->data))
case 5:ListEmpty_L(L);break;
case 6:printf("线性表的长度为%d.\n",ListLength_L(Q));break;
case 7:{
int i;
printf("请输入查找的数据位序:\n");
scanf("%d",&i);
GetElem_L(L,i);
break;
printf("请输入学生的数据,学号为零停止:\n学号:\n");
scanf("%d",&p1->data.num);
printf("姓名:\n");
scanf("%s",&p1->);
printf("年龄\n");
scanf("%d",&p1->data.age);
printf("性别:\n");
}
void main()
{
Linklist L,Q,p;
printf("首先请先建立一个学生数据单链表再进行其他操作\n");
Q=ListCreat_L();
p=Q;
L=Q;
printf("现在输出建立的表\n");
display(p);
int n;
printf(" \n请输入任意键进入菜单........\n");
printf("ERROR\n");
else
{
printf("cur_e的前驱为:\n");
printf("num:%d\nname:%s\nsex:%s\nage:%d\ngrade:%f\n",p->data.num,p->,p->data.sex,p->data.age,p->data.grade);
printf("OK\n");
return L;
}
}
void DestroyList_L(Linklist L)//销毁单向链表*/
{
Linklist p;
if(!L)
printf("ERROR\n");
else
{
while(L)
{
p=L;
L=L->next;
free(p);
}
printf("OK\n");
printf("请输入学生的数据,学号为零停止\n学号:\n");
scanf("%d",&p1->data.num);
printf("姓名:\n");
scanf("%s",&p1->);
printf("年龄\n");
scanf("%d",&p1->data.age);
printf("性别:\n");
printf("OK\n");
}
}
void ListInsert_L(Linklist L,int i)/*在i位置之前插入新元素*/
{
int j=0;
Linklist p=L,s;
while(p&&j<i-2)
{
p=p->next;
++j;
}
if(!p||j>i-2)
printf("ERROR\n");
else
{
s=(Linklist)malloc(sizeof(LNode));
printf("请输入要插入的元素的数据:\n");
printf("学号:\n");
scanf("%d",&s->data.num);
printf("姓名:\n");
scanf("%s",&s->);
printf("年龄\n");
printf("OK\n");
}
}
void NextElem_L(Linklist L,stu cur_e)/*用next_e返回cur_e的后驱*/
{
Linklist p=L;
while(p&&(p->data).num!=cur_e.num)
p=p->next;
if(!p||!p->next)
printf("ERROR\n");
struct LNode *next;
}LNode,* Linklist;
Linklist InitList_L(Linklist L)/*构造一个空的单向链表*/
{
L=(Linklist)malloc(sizeof(stu));
if(!L)
printf("ERROR\n");
else
{
L=NULL;
++j;
}
if(!p||j>i)
printf("ERROR\n");
else
{
printf("学生%d的数据为:\n",i);
printf("学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n成绩:%f\n",p->data.num,p->,p->data.sex,p->data.age,p->data.grade);
else
{
printf("cur_e的后驱为:\n");
printf("num:%d\nname:%s\nsex:%s\nage:%d\ngrade:%f\n",p->next->data.num,p->next->,p->next->data.sex,p->next->data.age,p->next->data.grade);
#include <stdio.h>
#include <malloc.h>
typedef struct Student/*定义学生类*/
{
int num;
char name[20];
char sex[2];
int age;
float grade;
}stu;
typedef struct LNode
{
stu data;
}
case 8:{
stu cur_e;
printf("请输入cue_e的学生的学号:\n");
scanf("%d",&cur_e.num);
PriorElem_L(L,cur_e);
break;
}
case 9:{
stu cur_e;
printf("请输入cue_e的学生的学号:\n");
scanf("%d",&cur_e.num);
printf("学号姓名性别年龄成绩\n");
while(p)
{
printf("%d\t%s\t%s\t%d\t%f\n",p->data.num,p->,p->data.sex,p->data.age,p->data.grade);
p=p->next;
}
printf("****************************************\n");
}
}
void ListDelete_L(Linklist L,int i)/*删除第i个元素*/
{
Linklist p=L,q;
int j=0;
while(p&&j<i-2)
{
p=p->next;
++j;
}
if(!p->next||j>i-2)
printf("ERROR\n");
else
{
q=p->next;
{
if(!L)
printf("ERROR\n");
else
{
if(!L->next)
printf("TRUE\n");
else
printf("FLASE\n");
}
}
int ListLength_L(Linklist L)/*返回L中数据元素个数*/
{
int i=0;
Linklist p=L;
if(!L)
scanf("%s",&p1->data.sex);
printf("成绩:\n");
scanf("%f",&p1->data.grade);
相关文档
最新文档