
数据结构-使用C语言(第5版)(作者朱战立写的)
本专栏所有源代码全部在DEV-C++5.11和VS2019这两个IDE(集成开发环境)下编译通过,没有任何错误和任何警告。
AKK188888881
这个作者很懒,什么都没留下…
展开
-
题目:约瑟夫环问题模拟。 问题描述:设编号为1,2,...,n(n>0)的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时,任意给出一个报数上限值m,从第一个人开始顺时针方向从1开始顺序报数
题目:约瑟夫环问题模拟。问题描述:设编号为1,2,…,n(n>0)的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时,任意给出一个报数上限值m,从第一个人开始顺时针方向从1开始顺序报数,报道m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1开始顺序报数;如此下去,直到所有人全部出列为止。要求:设计一个程序模拟此过程,并输出出列人的编号序列。基本要求:(1)把带头节点的单循环链表设计为头文件。(2)把带头节点的单循环链表作为存储结构。测试数据:原创 2020-10-12 08:36:15 · 11642 阅读 · 0 评论 -
P272 例11-5 哈希表设计。要求: (1)哈希函数采用除留余数法,解决哈希冲突方法采用开放定址法的线性探查法。 (2)设计函数表构造头文件。头文件包括节点结构体定义,以及哈希表初始化、哈希表元素
P272 例11-5 哈希表设计。要求:(1)哈希函数采用除留余数法,解决哈希冲突方法采用开放定址法的线性探查法。(2)设计函数表构造头文件。头文件包括节点结构体定义,以及哈希表初始化、哈希表元素插入、哈希表元素删除、哈希表查找和哈希表撤销函数。(3)设计一个测试程序进行测试。要求首先建立包括数据元素{180,750,600,430,541,900,460}的哈希表,然后输出所建立的哈希表,并查找数据元素430是否在哈希表中,最后删除数据元素430,并再次查找数据元素430是否哎哈希表中。(4)建立原创 2020-10-12 08:27:04 · 1466 阅读 · 0 评论 -
P259 例11-2 编写程序,要求: (1)利用二叉排序树插入函数,建立包含数据元素{4,5,7,2,1,9,8,11,3}的二叉排序树; (2)查找数据元素9是否存在; (3)用中序遍历法输出二叉
P259 例11-2 编写程序,要求:(1)利用二叉排序树插入函数,建立包含数据元素{4,5,7,2,1,9,8,11,3}的二叉排序树;(2)查找数据元素9是否存在;(3)用中序遍历法输出二叉排序树中的数据元素。头文件:BiSortTree.h#include<stdio.h>#include<stdlib.h>typedef int KeyType;typedef struct{ KeyType key;}DataType;typedef struc原创 2020-10-12 08:25:21 · 337 阅读 · 0 评论 -
P252 11.2.2 折半查找
P252 11.2.2 折半查找头文件:SeqList.h#include<stdio.h>#define MaxSize 100typedef int KeyType;typedef struct{ KeyType key;}DataType;typedef struct{ DataType list[MaxSize]; int size;}SeqList;void ListInitiate(SeqList *L){ L->size=0;}原创 2020-10-12 08:23:32 · 146 阅读 · 0 评论 -
P250 例11-1 编写程序。要求首先建立一个包含数据元素{710,342,45,686,6,841,429,134,68,264}的顺序表,然后查找数据元素686是否存在于顺序表中。
P250 例11-1 编写程序。要求首先建立一个包含数据元素{710,342,45,686,6,841,429,134,68,264}的顺序表,然后查找数据元素686是否存在于顺序表中。头文件:SeqList.h#include<stdio.h>#define MaxSize 100typedef int KeyType;typedef struct{ KeyType key;}DataType;typedef struct{ DataType list[MaxSi原创 2020-10-12 08:19:38 · 234 阅读 · 0 评论 -
P243 例10-2 以图10-11为例编写测试基数排序算法的程序。
P243 例10-2 以图10-11为例编写测试基数排序算法的程序。头文件:LinQueue.h#include<stdio.h>#include<stdlib.h>typedef int KeyType;typedef struct{ KeyType key;}DataType;typedef struct qnode{ DataType data; struct qnode *next;}LQNode;typedef struct{ LQN原创 2020-10-12 08:17:44 · 148 阅读 · 0 评论 -
P239 10.5 归并排序 完整源文件
P239 10.5 归并排序 完整源文件#include<stdio.h>#include<stdlib.h>typedef int KeyType;typedef struct{ KeyType key;}DataType;void Merge(DataType a[],int n,DataType swap[],int k){ int m=0,u1,l2,i,j,u2; int l1=0; while(l1+k<=n-1) { l2=l1原创 2020-10-12 08:15:57 · 203 阅读 · 0 评论 -
P236 10.4.2 快速排序 完整源文件
P236 10.4.2 快速排序 完整源文件#include<stdio.h> typedef int KeyType;typedef struct{ KeyType key;}DataType;void QuickSort(DataType a[],int low,int high){ int i=low,j=high; DataType temp=a[low]; while(i<j) { while(i<j&&temp.key原创 2020-10-12 08:15:00 · 119 阅读 · 0 评论 -
P235 10.4.1 冒泡排序 完整源文件
P235 10.4.1 冒泡排序 完整源文件#include<stdio.h> typedef int KeyType;typedef struct{ KeyType key;}DataType;void BubbleSort(DataType a[],int n){ int i,j,flag=1; DataType temp; for(i=1;i<n&&flag==1;i++) { flag=0; for(j=0;j<n-i原创 2020-10-12 08:14:14 · 146 阅读 · 0 评论 -
P231 10.3.2 堆排序 完整源文件
P231 10.3.2 堆排序 完整源文件#include<stdio.h>typedef int KeyType;typedef struct{ KeyType key;}DataType;void CreatHeap(DataType a[],int n,int h){ int i,j,flag; DataType temp; i=h; j=2*i+1; temp=a[i]; flag=0; while(j<n&&flag!=原创 2020-10-11 14:21:31 · 144 阅读 · 0 评论 -
P229 10.3.1 直接选择排序 完整源文件
P229 10.3.1 直接选择排序 完整源文件#include<stdio.h> typedef int KeyType;typedef struct{ KeyType key;}DataType;void SelectSort(DataType a[],int n){ int i,j,small; DataType temp; for(i=0;i<n-1;i++) { small=i; for(j=i+1;j<n;j++) {原创 2020-10-11 14:20:36 · 114 阅读 · 0 评论 -
P228 10.2.2 希尔排序 完整源文件
P228 10.2.2 希尔排序 完整源文件#include<stdio.h>typedef int KeyType;typedef struct{ KeyType key;}DataType;void ShellSort(DataType a[],int n,int d[],int numOfD){ int i,j,k,m,span; DataType temp; for(m=0;m<numOfD;m++) { span=d[m]; for(k=原创 2020-10-11 14:19:48 · 134 阅读 · 0 评论 -
P227 例10-1以如图10-1所示的数据为测试例子,编写一个测试直接插入排序函数的程序。
P227 例10-1以如图10-1所示的数据为测试例子,编写一个测试直接插入排序函数的程序。#include<stdio.h>typedef int KeyType;typedef struct{ KeyType key;}DataType;void InsertSort(DataType a[],int n){ int i,j; DataType temp; for(i=0;i<n-1;i++) { temp=a[i+1]; j=i; whi原创 2020-10-11 14:18:30 · 260 阅读 · 0 评论 -
P211 例9-4 以如图9-13所示的有向带权图为例设计测试上述Dijkstra函数的程序。
P211 例9-4 以如图9-13所示的有向带权图为例设计测试上述Dijkstra函数的程序。头文件1:SeqList.h#ifndef SeqList_H#define SeqList_H#include<stdio.h>#define MaxSize 100typedef char DataType;typedef struct{ DataType list[MaxSize]; int size;}SeqList;void ListInitiate(SeqL原创 2020-10-11 14:15:26 · 207 阅读 · 0 评论 -
P206 例9-3 以如图9-10(a)所示的无向连通带权图为例测试上述普利姆函数的程序。设普利姆函数存放在文件Prim.h中,邻接矩阵存储结构定义及相应的图操作函数放在文件AdjMGraph.h中,
P206 例9-3 以如图9-10(a)所示的无向连通带权图为例测试上述普利姆函数的程序。设普利姆函数存放在文件Prim.h中,邻接矩阵存储结构定义及相应的图操作函数放在文件AdjMGraph.h中,图的创建函数存放在AdjMGraphCreate.h中。头文件1:SeqList.h#ifndef SeqList_H#define SeqList_H#include<stdio.h>#define MaxSize 100typedef char DataType;typed原创 2020-10-11 14:11:51 · 380 阅读 · 0 评论 -
P202 例9-2 以如图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序。
P202 例9-2 以如图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序。头文件1:SeqList.h#ifndef SeqList_H#define SeqList_H#include<stdio.h>#define MaxSize 100typedef char DataType;typedef struct{ DataType list[MaxSize]; int size;}SeqList;void ListInitiate原创 2020-10-11 14:07:55 · 744 阅读 · 0 评论 -
P193 例9-1 以如图9-8所示的带权有向图为例,编写测试上述图操作函数的程序。
P193 例9-1 以如图9-8所示的带权有向图为例,编写测试上述图操作函数的程序。头文件1:SeqList.h#ifndef SeqList_H#define SeqList_H#include<stdio.h>#define MaxSize 100typedef char DataType;typedef struct{ DataType list[MaxSize]; int size;}SeqList;void ListInitiate(SeqList *原创 2020-10-11 14:03:12 · 481 阅读 · 0 评论 -
P179 例8-6 根据前面讨论的并查算法,设计一个程序,完成例8-5的等价类建立。
P179 例8-6 根据前面讨论的并查算法,设计一个程序,完成例8-5的等价类建立。例8-6.cpp#include<iostream>using namespace std;typedef struct{ int data; int parent;}ESet;void Initialize(ESet x[],int n){ for(int e=1;e<=n;e++) { x[e].data=e; x[e].parent=-1; }}int Fi原创 2020-10-11 14:00:04 · 139 阅读 · 0 评论 -
P176 例8-4 设有字符集{A,B,C,D},各字符在电文中的次数集为{1,3,5,7},设计各字符的哈夫曼编码。
P176 例8-4 设有字符集{A,B,C,D},各字符在电文中的次数集为{1,3,5,7},设计各字符的哈夫曼编码。头文件:Haffman.h#include<stdio.h>#include<stdlib.h> #define MaxValue 10000#define MaxBit 4 typedef struct{ int weight; int flag; int parent; int leftChild; int rightChild;}H原创 2020-10-10 10:49:33 · 1908 阅读 · 0 评论 -
P169 例8-3 编写程序,首先建立如图8-10(a)所示的不带头节点的二叉树,然后中序线索化二叉树,最后用循环结构输出该中序线索化二叉树各结点的序列信息。
P169 例8-3 编写程序,首先建立如图8-10(a)所示的不带头节点的二叉树,然后中序线索化二叉树,最后用循环结构输出该中序线索化二叉树各结点的序列信息。头文件:InThreadIterator.h#include<stdio.h>#include<stdlib.h>typedef char DataType;typedef struct Node{ DataType data; int leftThread; struct Node *leftChild;原创 2020-10-10 10:48:01 · 443 阅读 · 0 评论 -
P162 例8-2 编写程序,建立如图8-10(b)所示的带头节点的二叉链存储结构二叉树,首先打印该二叉树,然后分别输出按照前序遍历二叉树次序、中序遍历二叉树次序和后序遍历二叉树次序访问各节点的信息,
P162 例8-2 编写程序,建立如图8-10(b)所示的带头节点的二叉链存储结构二叉树,首先打印该二叉树,然后分别输出按照前序遍历二叉树次序、中序遍历二叉树次序和后序遍历二叉树次序访问各节点的信息,最后查找字符’E’是否在二叉树中。头文件1:BiTree.h#include<stdio.h>#include<stdlib.h>typedef char DataType;typedef struct Node{ DataType data; struc原创 2020-10-10 10:46:36 · 1279 阅读 · 0 评论 -
P158 例8-1 编写程序,建立如图8-10(b)所示的带头节点的二叉链存储结构二叉树。
P158 例8-1 编写程序,建立如图8-10(b)所示的带头节点的二叉链存储结构二叉树。头文件:BiTree.h#include<stdio.h>#include<stdlib.h>typedef char DataType;typedef struct Node{ DataType data; struct Node *leftChild; struct Node *rightChild;}BiTreeNode;void Initia原创 2020-10-10 10:44:25 · 674 阅读 · 0 评论 -
P144 例7-3 设有广义表E=(((a,b,c),(d)),e),要求: (1)创建初始值等于E的广义表。 (2)给出广义表E的表头数值和表尾数值。 (3)查找原子d是否在广义表E中。
P144 例7-3 设有广义表E=(((a,b,c),(d)),e),要求:(1)创建初始值等于E的广义表。(2)给出广义表E的表头数值和表尾数值。(3)查找原子d是否在广义表E中。头文件:GList.h原创 2020-10-10 10:42:57 · 401 阅读 · 0 评论 -
P141 例7-2 设广义表采用头链和尾链存储结构,要求: (1)编写按广义表中原子项所在层次输出所有原子项和广义表输出函数。 (2)设广义表L=(((a,b,c),d),e,(f)),编写一个主函数
P141 例7-2 设广义表采用头链和尾链存储结构,要求:(1)编写按广义表中原子项所在层次输出所有原子项和广义表输出函数。(2)设广义表L=(((a,b,c),d),e,(f)),编写一个主函数测试输出函数。头文件:GList.h#include<stdio.h>#include<stdlib.h>#include<string.h>typedef char DataType;typedef struct GListNode{ int tag;原创 2020-10-10 10:38:27 · 501 阅读 · 0 评论 -
P140 例7-1 设有广义表E=(((a,b,c),(d)),e),要求: (1)创建初始值等于E的广义表。 (2)给出广义表E的表头数值和表尾数值。 (3)分别给出广义表E的深度、长度和原子个数。
P140 例7-1 设有广义表E=(((a,b,c),(d)),e),要求:(1)创建初始值等于E的广义表。(2)给出广义表E的表头数值和表尾数值。(3)分别给出广义表E的深度、长度和原子个数。(4)查找原子d是否在广义表E中。头文件:GList.h#include<stdio.h>#include<stdlib.h>#include<string.h>typedef char DataType;typedef struct GListNode{原创 2020-10-10 10:36:41 · 429 阅读 · 0 评论 -
P127-P128 例6-10 设计求解迷宫问题的算法并用实际例子测试。 迷宫问题描述:一个迷宫是一些互相连通的交叉路口的集合,给定一个迷宫路口,一个迷宫出口,当从入口到出口存在通路时,输出其中的一条
P127-P128 例6-10 设计求解迷宫问题的算法并用实际例子测试。迷宫问题描述:一个迷宫是一些互相连通的交叉路口的集合,给定一个迷宫路口,一个迷宫出口,当从入口到出口存在通路时,输出其中的一条通路;当从入口到出口不存在通路时,输出无通路存在。每个交叉路口,除进来的路外还有三个路口,分别是向左、向前和向右。为简化设计,假设迷宫中不存在环路。如图6-8所示是一个没有环路的迷宫示意图。头文件:P128-P130回溯算法求解迷宫问题.h#include<stdio.h>#include&l原创 2020-10-10 10:35:00 · 769 阅读 · 1 评论 -
P123 例6-6 借助堆栈模拟系统的运行时进栈、出栈过程,把汉诺塔问题的递归算法转换为非递归算法,并分析非递归算法的时间复杂度。
P123 例6-6 借助堆栈模拟系统的运行时进栈、出栈过程,把汉诺塔问题的递归算法转换为非递归算法,并分析非递归算法的时间复杂度。头文件:SeqStack.h#include<stdio.h>#define MaxStackSize 100typedef struct{ int retAddr; int nPara; char fromPegPara; char toPegPara; char auxPegPara;}DataType;typedef struct原创 2020-10-10 10:33:04 · 185 阅读 · 0 评论 -
P117 例6-3 设计模拟汉诺塔问题求解过程的算法。汉诺塔问题的描述是:设有3根标号为A,B,C的柱子,在A柱上放着n个盘子,每个上面的盘子都比下面的盘子略小一点,要求把A柱上的盘子全部移到C柱上。
P117 例6-3 设计模拟汉诺塔问题求解过程的算法。汉诺塔问题的描述是:设有3根标号为A,B,C的柱子,在A柱上放着n个盘子,每个上面的盘子都比下面的盘子略小一点,要求把A柱上的盘子全部移到C柱上。移动的规则是:①一次只能移动一个盘子;②移动过程中大盘子不能放在小盘子上面;③在移动过程中,盘子可以放在标号为A,B,C的任意一根柱子上。#include<stdio.h>void Towers(int n,char fromPeg,char toPeg,char auxPeg){ if(原创 2020-10-09 00:22:49 · 577 阅读 · 0 评论 -
P115 例6-2 给出在有序数组a中查找数据元素x是否存在的递归算法,并说明递归算法的执行过程。
P115 例6-2 给出在有序数组a中查找数据元素x是否存在的递归算法,并说明递归算法的执行过程。#include<stdio.h>int BSearch(int a[],int x,int low,int high){ int mid; if(low>high) return -1; mid=(low+high)/2; if(x==a[mid]) return mid; else if(x<a[mid]) return BSearch(a,x,low,原创 2020-10-09 00:21:37 · 1090 阅读 · 0 评论 -
P114 例6-1 给出按照式(6-3)计算阶乘函数的递归算法,并给出n=3时递归算法的执行过程。
P114 例6-1 给出按照式(6-3)计算阶乘函数的递归算法,并给出n=3时递归算法的执行过程。#include<stdio.h>long Fact(int n){ int x; long y; if(n<0) { printf("参数错!"); return -1; } if(n==0) return 1; else { x=n-1; y=Fact(x); return n*y; }}int main(){ long fn;原创 2020-10-09 00:20:57 · 278 阅读 · 0 评论 -
P105 例5-3 编写实现C=A+B操作的函数。其中,矩阵A、矩阵B和矩阵C均采用压缩存储方式存储,矩阵元素均为int类型。并设计一个测试主函数,要求按矩阵方式输出矩阵C的数值。设矩阵A和矩阵B为如
P105 例5-3 编写实现C=A+B操作的函数。其中,矩阵A、矩阵B和矩阵C均采用压缩存储方式存储,矩阵元素均为int类型。并设计一个测试主函数,要求按矩阵方式输出矩阵C的数值。设矩阵A和矩阵B为如下所示的矩阵:A=1 2 3 B=10 20 302 4 5 20 40 503 5 6 30 50 60#include<stdio.h>void Add(int a[],int b[],int c[],int n){ int i; for(i=0;i<原创 2020-10-09 00:20:17 · 2120 阅读 · 0 评论 -
P101 例5-2 定义有3行、4列int类型的二维数组a,先逐行分别给数组元素赋数据1,2,3,...,12,然后显示数组中的数值。要求:分别把申请二维动态数组的过程和释放二维动态数组的过程编写成函
P101 例5-2 定义有3行、4列int类型的二维数组a,先逐行分别给数组元素赋数据1,2,3,…,12,然后显示数组中的数值。要求:分别把申请二维动态数组的过程和释放二维动态数组的过程编写成函数。#include<stdio.h>#include<stdlib.h>int **Make2DArray(int row,int col){ int **a,i; a=(int **)calloc(row,sizeof(int *)); for(i=0;i<原创 2020-10-09 00:19:18 · 1101 阅读 · 0 评论 -
P101 例5-1 定义有10个元素的int类型一维数组a,先分别给数组元素赋数据1,2,3,...,10,然后显示数组中的数值。
P101 例5-1 定义有10个元素的int类型一维数组a,先分别给数组元素赋数据1,2,3,…,10,然后显示数组中的数值。#include<stdio.h>#include<stdlib.h>int **Make2DArray(int row,int col){ int **a,i; a=(int **)calloc(row,sizeof(int *)); for(i=0;i<row;i++) a[i]=(int*)calloc(col,size原创 2020-10-09 00:18:38 · 1938 阅读 · 0 评论 -
P94 例4-7 编程比较Brute-Force算法和KMP算法的实际比较次数。两个测试例子为: (1)S=”cddcdc”,T=”abcde” (2)S=”aaaaaaaa”,T=”aaaab”
P94 例4-7 编程比较Brute-Force算法和KMP算法的实际比较次数。两个测试例子为:(1)S=”cddcdc”,T=”abcde”(2)S=”aaaaaaaa”,T=”aaaab”头文件:DString.h#include<stdio.h>#include<stdlib.h> #include<string.h>typedef struct{ char *str; int maxLength; int length;}DString;原创 2020-10-09 00:17:34 · 496 阅读 · 0 评论 -
P94 例4-6 编写一个程序,测试KMPIndex()函数和GetNext()函数的正确性。
P94 例4-6 编写一个程序,测试KMPIndex()函数和GetNext()函数的正确性。头文件:DString.h#include<stdio.h>#include<stdlib.h> #include<string.h>typedef struct{ char *str; int maxLength; int length;}DString;void Initiate(DString *S,int max,char *string){原创 2020-10-09 00:14:51 · 211 阅读 · 0 评论 -
P88 例4-3 编写一个程序,测试BFIndex()函数的正确性。
P88 例4-3 编写一个程序,测试BFIndex()函数的正确性。头文件:DString.h#include<stdio.h>#include<stdlib.h> #include<string.h>typedef struct{ char *str; int maxLength; int length;}DString;void Initiate(DString *S,int max,char *string){ int i; S-&g原创 2020-10-09 00:12:49 · 1330 阅读 · 0 评论 -
P86 例4-2 编写一个程序,测试上述动态数组存储结构下串操作函数的正确性。
P86 例4-2 编写一个程序,测试上述动态数组存储结构下串操作函数的正确性。头文件:DString.h#include<stdio.h>#include<stdlib.h> #include<string.h>typedef struct{ char *str; int maxLength; int length;}DString;void Initiate(DString *S,int max,char *string){ int i;原创 2020-10-09 00:11:12 · 205 阅读 · 0 评论 -
P80 例4-1 名和姓的对换问题。英国人和美国人姓名的书写形式是“名在前,姓在后”,但在有些情况下,需要把姓名写成“姓在前,名在后,中间加一个逗号”的形式。编写一个程序实现把“名在前,姓在后”的姓名
P80 例4-1 名和姓的对换问题。英国人和美国人姓名的书写形式是“名在前,姓在后”,但在有些情况下,需要把姓名写成“姓在前,名在后,中间加一个逗号”的形式。编写一个程序实现把“名在前,姓在后”的姓名表示法转换成“姓在前,名在后,中间加一个逗号”的姓名表示法。#include<stdio.h>#include<string.h>void ReverseName(char *name,char *newName){ char *p; p=strchr(name,' ');原创 2020-10-08 12:07:25 · 1666 阅读 · 0 评论 -
P71 例3-6 设计一个程序模仿操作系统的进程管理问题。进程服务按优先级高的先服务、优先级相同的先到先服务的原则管理。设文件task.dat中存放了仿真进程请求服务,其中第一列表示进程的任务号,第二
P71 例3-6 设计一个程序模仿操作系统的进程管理问题。进程服务按优先级高的先服务、优先级相同的先到先服务的原则管理。设文件task.dat中存放了仿真进程请求服务,其中第一列表示进程的任务号,第二列表示进程的优先级。头文件:SeqPQueue.h#include<stdio.h>#include<stdlib.h>#define MaxQueueSize 100typedef int ElemType;typedef struct{ int priority原创 2020-10-08 12:06:37 · 1001 阅读 · 0 评论 -
P67 例3-5 设计一个模拟打印任务模拟器运行过程的程序。
P67 例3-5 设计一个模拟打印任务模拟器运行过程的程序。头文件:PrintTaskManager.h#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{ int id; char *text; struct node *next;}Task;typedef struct{ Task *front; Task *rear;}Queue;vo原创 2020-10-08 12:00:52 · 518 阅读 · 1 评论