西安交大朱站立《数据结构——使用C语言》头文件系列——顺序队列

本顺序队列工程包含2个头文件(StackCode.h、Queue.h)和一个源文件(Queue.cpp),本处对之前系列之二的堆栈的头文件做了小小的修改,以便完全对应书中内容。

依然是存为word以便使用
头文件1 StackCode.h
typedef struct
{
DataType stack[MaxStackSize];
int top;
}SeqStack;
void StackInitiate(SeqStack *S)//初始化顺序堆栈
{
S->top=0;
}
int StackNotEmpty(SeqStack S)//判断堆栈是否为空
{/*为空返回0,非空返回1*/
if(S.top<=0) return 0;
else return 1;
}
int StackPush(SeqStack *S,DataType x)//入栈
{
if (S->top>=MaxStackSize)
{
printf("堆栈已满无法插入!\n");
return 0;
}
else
{
S->stack[S->top]=x;
S->top++;
return 1;
}
}
int StackPop(SeqStack *S,DataType *d)//出栈
{
if(S->top<=0)
{
printf("堆栈已空无法弹出!\n");
return 0;
}
else
{
S->top--;
*d=S->stack[S->top];
return 1;
}
}
int StackTop(SeqStack S,DataType *d)//取栈顶元素{
if (S.top<=0)
{
printf("堆栈已空!\n");
return 0;
}
else
{
*d=S.stack[S.top-1];
return 1;
}
}
头文件2 Queue.h
//定义结点结构体
typedef struct qnode
{
DataType queue[MaxQueueSize];
int rear; /*队尾指针*/
int front; //队头指针
int count; //计数器
}SeqCQueue;//顺序队列
void QueueInitiate(SeqCQueue *Q) //初始化{
Q->rear=0; //定义初始队尾指针下标值Q->front=0; //定义初始队头指针下标值Q->count=0; //定义书初始计数器值
}
int QueueNotEmpty(SeqCQueue Q)
{//判断是否非空,空返回0,非空返回1
if(Q.count!=0) return 1;
else return 0;
}
int QueueAppend(SeqCQueue *Q,DataType x)
{//将x插入队尾,成功返回1,失败返回0
if(Q->count>0 && Q->rear==Q->front)//判断队列是否满了{
printf("队列已满无法插入!\n");
return 0;
}
else
{
Q->queue[Q->rear]=x;
Q->rear=(Q->rear+1) % MaxQueueSize;
Q->count++;
return 1;
}
}
int QueueDelete(SeqCQueue *Q,DataType *d)
{
if(Q->count==0)
{
printf("队列已空无法出列!\n");
return 0;
}
else
{
*d=Q->queue[Q->front];
Q->front=(Q->front+1) % MaxQueueSize;
Q->count--;
return 1;
}
}
int QueueGet(SeqCQueue Q,DataType *d)
{
if(Q.count==0)
{
printf("队列已空无数据可取!\n");
return 0;
}
else
{
*d=Q.queue[Q.front];
return 1;
}
}
测试主函数Queue.cpp
#include <stdio.h>
#include <string.h>
#define MaxQueueSize 100
#define MaxStackSize 100
typedef char DataType;//定义具体应用的数据类型
#include "Queue.h"
#include "StackCode.h"
void HuiWen(char str[])
{//判断是否回文的函数
SeqCQueue myQueue;
SeqStack myStack;
char x,y;
int i,length;
length=strlen(str);
QueueInitiate(&myQueue);
StackInitiate(&myStack);
for(i=0;i<length;i++)
{
QueueAppend(&myQueue,str[i]);
StackPush(&myStack,str[i]);
}
while (QueueNotEmpty(myQueue)==1 && StackNotEmpty(myStack) == 1)
{
if(QueueDelete(&myQueue,&x)==1 && StackPop(&myStack,&y)==1 && x!=y)
{
printf("%s不是回文!\n",str);
return;
}
}
if(QueueNotEmpty(myQueue) || StackNotEmpty(myStack))
printf("%s不是回文!\n",str);
else
printf("%s是回文!\n",str);
}
void main(void)
{//测试主函数
char str1[]="ABCDEDCBA";
char str2[]="ABCDEDCAB";
HuiWen(str1);
HuiWen(str2);
}。

合集下载

数据结构(朱战力版)第1章

数据结构(朱战力版)第1章

内容安排
章 内 容 绪 论 学时 章 内 容 树和二叉树 图 排序 查找 学时
1 2 3 4 5 6
3 9 6 3 3 2
7 8 9 10
10 4 6 6 1264
7
线性表 栈和队列 串 数组 递归算法
11 上机(共六次) 12
合计
对学生的几点要求
1、上课认真听讲,适当做好笔记,按时交作业。
2、考试成绩分两部分:平时成绩(包括出勤和上机实验)占 30%,期末成绩占70%。
渐进符号(O)的定义:当且仅当存在一个正的常
数 C,使得对所有的 n n0 ,有 f(n) Cg(n), 则: f(n) = O(g(n))
例:
3n+2=O(n) 因为 3n+24n for n2
6*2n+n2=O(2n) 因为6*2n+n2 7*2n
for n4
28
3 计算举例 例:分析以下程序段的时间复杂度。
正确性、可读性、健壮性、高效率与低存储量需求(见课本P20) 常用时间复杂度来衡量 常用空间复杂度来衡量
26
2 时间复杂度和空间复杂度如何表示?
多项式阶 时间复杂度T(n)按数量级递增顺序为:
复杂度低
复杂度高
注: 1) O()为渐近符号。 2) 空间复杂度S(n)按数量级递增顺序也与上表类似。
27
讨论: 1 什么是算法?如何评判算法的好坏?
2 时间复杂度和空间复杂度如何表示?
3 计算举例
25
1 什么是算法?如何评判一个算法的好坏?
算法:是对特定问题求解步骤的一种描述,它是指令 的有限序列,是一系列输入转换为输出的计算步骤。 好的程序设计:好算法+好结构 算法的基本特性:有穷性、确定性、可行性、必有输出 算法评价指标:

数据结构使用C语言朱战立(2)

数据结构使用C语言朱战立(2)
17
《数据结构课程》所处的地位 :
No Image
18
数据结构的核心研究内容
No 数据的逻辑结构、存储结构及它们之
间的关系和相应的基本操作运算的定义和 实现。
本书围绕数据结构的三种基本结构:
Image 线性结构(第2-5章)、树形结构(第7章)
和图形结构(第8章)展开讨论,研究解 决如下问题:一个具体问题的逻辑数据结 构是什么?适宜选用什么样的存储结构? 采用什么样的操作实现算法效率更高?
7
电子计算机的主要用途:
No • 早期: 主要用于数值计算。 后来: 处理逐渐扩大到非数值计算领域(能 Image 处理多种复杂的具有一定结构关系的数据 )。
8
数值计算解决问题的一般步骤
No :
数学模型→选择计算机语言→编出程序→ 测试→最终解答。 数值计算的关键是:如何得出数学模型(
Image 方程)?
计算机网络
软件工程
应用系统设计
计算机网络

16
数据结构课程的地位
No 它是计算机专业及相关专业的核心课
程之一,是计算机及相关专业的重要骨干 基础课程。
它针对非数值计算的程序设计问题,
Image 研究计算机的操作对象以及它们之间的关
系和操作。即其研究目的是研究有效地组 织和处理非数值类型数据的理论、技术和 方法。
程序设计人员比较关注程序设计的技巧。
非数值计算问题:
数据元素之间的相互关系一般无法用数 学方程加以描述
非数值计算问题:
No 例1.1 电话号码查询问题:
(1)按顺序存储方式:须遍历表 (2)按姓氏索引方式:索引
要写出好的查找算法,取决于这张表的
Image 结构及存储方式。 电话号码表的结构和存储方式决定了查 找(算法)的效率。

数据结构使用C语言(第4版).PPT课件

数据结构使用C语言(第4版).PPT课件
n(n≥ n0)满足T(n)≤c×f(n) 。
-
16
例1-3 设数组a和b在前边部分已赋值,求如下两个n阶矩 阵相乘运算算法的时间复杂度。
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ c[i][j]=0;
//基本语句1
for(k=0;k<n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j]; //基本语句2
-
4
线性结构:除第一个和最后一个数据元素外,每个
数
数据元素只有一个前驱和一个后继数据元素。
据
的
树结构:除根结点外,每个数据元素只有一个前驱
逻
数据元素,可有0个或若干个后继数据元素。
辑
结
构
图结构:每个数据元素可有0个或若干个前驱数据
元素和0个或若干个后继数据元素。
-
5
线性结构
树结构
-
图结构
6
顺序存储结构:把数据元素存储在一块连续地址空
void BubbleSort(int a[],int n)
{ int i,j,flag=1; int temp;
for(i=1;i<n&&flag==1;i++)
{ flag=0;
for(j=0;j<n-i;j++)
{ if(a[j]>a[j+1])
{ flag=1; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
数据间的逻辑关系表现在结点的链接关系上。
-

[电脑基础知识]数据结构——使用C语言第4版[朱战立][电子教案]第10章

[电脑基础知识]数据结构——使用C语言第4版[朱战立][电子教案]第10章
已排序数据元素子集合的适当位置。
算法如下:
void InsertSort (DataType a[], int n) //用直接插入法对a[0]--a[n-1]排序 {
int i, j; DataType temp; for(i=0; i<n-1; i++) { temp = a[i+1];
j = i; while(j > -1 && temp.key <= a[j].key) { a[j+1] = a[j];
算法如下:
void ShellSort (DataType a[], int n, int d[], int numOfD) //用希尔排序法对元素a[0]--a[n-1]排序,d[0]--d[numOfD-1]为希尔增量值 { int i, j, k, m, span;
DataType temp;
第10
排序的基本概念
主
插入排序
要 知 识
选择排序 交换排序归并排序
点
基数排序
性能比较
10.1 排序的基本概念
排序是对数据元素序列建立某种有序排列的过程,是把一个数据 元素序列整理成按关键字递增(或递减)排列的过程。
关键字是要排序的数据元素集合中的一个域,排序是以关键字 为基准进行的。
主关键字:数据元素值不同时该关键字的值也一定不同,是能够 惟一区分各个不同数据元素的关键字;不满足主关键字定义的关 键字称为次关键字。
10.3 选择排序
基本思想是:每次从待排序的数据元素集合中选取关键字
最小(或最大)的数据元素放到数据元素集合的最前(或最 后),数据元素集合不断缩小,当数据元素集合为空时选择 排序结束。

西安交大数据结构习题及答案

西安交大数据结构习题及答案

西安交大数据结构习题及答案西安交大数据结构习题及答案1:栈和队列1.1 栈1.1.1 基本概念栈是一种后进先出(Last-In-First-Out, LIFO)的数据结构,即最后进入的元素最先被访问。

1.1.2 基本操作- push(x): 元素x入栈- pop(): 弹出栈顶元素- top(): 返回栈顶元素- isEmpty(): 判断栈是否为空1.2 队列1.2.1 基本概念队列是一种先进先出(First-In-First-Out, FIFO)的数据结构,即最先进入的元素最先被访问。

1.2.2 基本操作- enqueue(x): 元素x入队- dequeue(): 移除队首元素- front(): 返回队首元素- rear(): 返回队尾元素- isEmpty(): 判断队列是否为空2:链表2.1 单链表2.1.1 基本概念单链表是一种线性结构,每个节点含有数据和指向下一个节点的指针。

2.1.2 基本操作- 初始化链表- 在链表头插入节点- 在链表尾插入节点- 在指定位置插入节点- 删除节点- 查找节点- 遍历链表2.2 双向链表2.2.1 基本概念双向链表是一种线性结构,每个节点含有数据、指向前一个节点的指针和指向后一个节点的指针。

2.2.2 基本操作- 初始化双向链表- 在链表头插入节点- 在链表尾插入节点- 在指定位置插入节点- 删除节点- 查找节点- 遍历链表3:树3.1 二叉树3.1.1 基本概念二叉树是一种数据结构,每个节点最多有两个子节点:左子节点和右子节点。

3.1.2 基本操作- 创建二叉树- 先序遍历- 中序遍历- 后序遍历- 层次遍历3.2 AVL树3.2.1 基本概念AVL树是一种自平衡的二叉搜索树,保证任意节点的左子树和右子树的高度差最多为1:3.2.2 基本操作- 插入节点- 删除节点- 查找节点- 遍历树4.1 图的表示4.1.1 邻接矩阵表示法4.1.2 邻接表表示法4.2 图的遍历4.2.1 深度优先搜索(DFS)4.2.2 广度优先搜索(BFS)4.3 最短路径算法4.3.1 Dijkstra算法4.3.2 Floyd-Warshall算法5:排序算法5.1 冒泡排序5.2 插入排序5.3 选择排序5.4 快速排序5.5 归并排序5.6 堆排序本文档涉及附件,请查看附件文件以获取更详细的信息。

数据结构课程教学大纲

数据结构课程教学大纲
《数据结构》课程教学大纲
课程
编号
01025016
01825064
01826064
课程
名称
(中文)数据结构
(英文)Data Structures
课
程
基
本
情
况
1.学分:4学时:40(课内学时:40实验学时:)
2.课程性质:学科基础必修课专业选修课
3.适算机原理》、《C语言程序设计》、《高等数学》
1.掌握线性表的基本概念。
2.掌握线性表的顺序存储结构和链式存储结构。
3.掌握特殊的线性表-栈和队列。
4.了解循环线性链表和双向链表。
(三)串(4学时)
1.了解串的基本概念和存储结构
2.了解串的基本运算
3.掌握串的模式匹配
(四)数组和广义表(4学时)
1.掌握数组顺序存储和链式存储结构
2.了解广义表的定义及其应用
配套
实践
环节
说明
大纲
编写
责任
人
信息与计算科学
(教研组)
戴筠(签名)
2001年06月30日
系
审核
意见
数学
(系)
顾桂定(签名)
2001年06月30日
学院
审核
意见
张金仓
(签名)
上海大学理学院(公章)
年月日
要求学生能够掌握数据的逻辑结构、物理结构以及各种结构所定义的运算和应用。对同一种逻辑结构的数据,讨论其不同的物理结构和相应的有关算法,掌握查找和排序的各种方法。
课
程
内
容
及
学
时
分
配
课
程
内
容
及
学

数据结构-使用C语言 朱战立 第3章堆栈和队列


top
D top C B A
D C B A
top
D C B A
top
顺序栈出栈函数的核心语句: S->top --; d = S->stack[S->top];
17
例5、 设依次进入一个栈的元素序列为c,a,b,d,则 可得到出栈的元素序列是:
A)a,b,c,d C)b,c,d,a
B)c,d,a,b D)a,c,d,b
初始化堆栈S 堆栈S非空否 入栈 出栈 取栈顶数据元素
11
二、堆栈的顺序表示和实现 1、顺序(堆)栈
顺序存储结构的堆栈。
顺序栈S an an-1 …… 栈顶top
2、顺序栈的存储结构
它是利用一组地址连续的存储 单元依次存放自栈底到栈顶的数据 元素,同时设指针top指示当前栈顶 位置。
ai …… a1 a0
具体方法:顺序扫描算术表达式(表现为一个字符串), 当遇到三种类型的左括号时让该括号进栈; 1. 当扫描到某一种类型的右括号时,比较当前栈顶括号是 否与之匹配,若匹配则退栈继续进行判断; 2. 若当前栈顶括号与当前扫描的括号不相同,则左右括号 配对次序不正确; 3. 若字符串当前为某种类型左括号而堆栈已空,则右括号 多于左括号; 4. 字符串循环扫描结束时,若堆栈非空(即堆栈中尚有某 种类型左括号),则说明左括号多于右括号;否则,左 右括号匹配正确。
14
顺序栈S
高地址
栈顶top
an an-1 …… ai …… a1 a0 入栈口诀:堆栈指针top “先 压后加” : S[top++]=an 栈底base 出栈口诀:堆栈指针top “先 减后弹” : e=S[--top]
低地址
栈不存在的条件: base=NULL; 栈为空的条件 : base=top或top<=0; 栈满的条件 : top-base=MaxSize;

其他系统西安交通大学--数据结构所有答案

其他系统西安交通大学--数据结构所有答案3,栈和队列都是顺序存取的的线性表,但它们对存取位置的限制不同。

,A 正确 B错误,答案是:A3,在使用后缀表表示实现计算器时用到一个栈的实例,其作用是暂存运算对象。

,A正确 B错误,答案是:A3,具有n个结点的完全二叉树的高度为┖log2n┘1。

,A正确 B错误,答案是:B3,为度量一个搜索算法的性能,需要在时间和空间方面进行权衡。

,A正确 B错误,答案是:A3,闭散列法通常比开散列法时间效率更高。

,A正确 B错误,答案是:B3,一棵m阶B树中每个结点最多有m个关键码,最少有2个关键码。

,A 正确 B错误,答案是:B3,有向图的邻接表和逆邻接表中表结点的个数不一定相等。

,A正确 B错误,答案是:B3,对链表进行插入和删除操作时不必移动链表中结点。

,A正确 B错误,答案是:A3,希尔排序算法的时间复杂度为On2。

,A正确 B错误,答案是:B3,用邻接矩阵作为图的存储结构时,则其所占用的存储空间与图中顶点数无关而与图中边数有关。

,A正确 B错误,答案是:B3,通常使用两个类来协同表示单链表,即链表的结点类和链表类。

,A正答案是:A3,顺序表用一维数组作为存储结构,因此顺序表是一维数组。

,A正确 B 错误,答案是:B3,二维数组是数组元素为一维数组的线性表,因此它是线性结构。

,A正确 B错误,答案是:B3,算法的运行时间涉及加、减、乘、除、转移、存、取、等基本运算。

要想准确地计算总运算时间是不可行的。

,A正确 B错误,答案是:A3,堆是完全二叉树,完全二叉树不一定是堆。

(),A正确 B错误,答案是:A3,顺序表查找指的是在顺序存储结构上进行查找。

(),A正确 B错误,答案是:B3,入栈操作和入队列操作在链式存储结构上实现时不需要考虑栈溢出的情况。

,A正确 B错误,答案是:A3,中序遍历一棵二叉排序树可以得到一个有序的序列。

,A正确 B错误,答案是:A3,用邻接矩阵作为图的存储结构时,则其所占用的存储空间与图中顶点数无关而与图中边数有关。

西安交大朱站立《数据结构——使用C语言》头文件


链表(LinList.h)
typedef struct Node { DataType data; struct Node *next; }SLNode; void ListInitiate(SLNode **head) //初始化 { /*如果有内存空间,申请头结点空间并使头指针 head 指向头结点*/ if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1); (*head)->next=NULL; /*置结束标记 NULL*/ } int ListLength(SLNode *head) { SLNode *p=head; int size=0; while(p->next!=NULL) { p=p->next; size++; } return size; } int ListInsert(SLNode *head,int i,DataType x) /*在带头结点的单链表 head 的第 i(0<=i<=size)个结点前 插入一个存放数据元素 x 的结点。插入成功返回 1,失败返回 0*/ { SLNode *p,*q; int j; p=head; j=-1; while(p->next!=NULL&&j<i-1) /*最终让指针 p 指向第 i-1 个结点*/ { p=p->next; j++; } if(j!=i-1) {
int ListDelete(SeqList *L,int i,DataType *x) /*删除顺序表 L 中位置为 i(0<=i<=size-1)的数据元素并存放到 x 中*/ /*删除成功返回 1,失败返回 0*/ { int j; if(L->size<=0) { printf("顺序表已空无可删!\n"); return 0; } else if(i<0||i>L->size-1) { printf("参数不合法!\n"); return 0; } else { *x=L->list[i]; //保存删除的元素到 x 中 for(j=i+1;j<=L->size-1;j++) L->list[j-1]=L->list[j]; L->size--; return 1; } } int ListGet(SeqList L,int i,DataType *x) /*取顺序表 L 中第 i 个数据元素存于 x 中,成功返回 1,失败返回 0*/ { if(i<0||i>L.size-1) { printf("参数不合法!\n"); return 0; } else { *x=L.list[i]; return 1; } } //数据元素个数减 1 //依次前移

数据结构——使用C语言朱战立数组PPT课件


i
j
d
0
1
3
11
1
1
5
17
2
2
2
25
3
4
1
19
4
5
4
37
5
6
7
50
6
Size=6
... ... ... ...
MaxSize-1
第24页/共31页
md 6 nd 7 td 6
3.稀疏矩阵的三元组链表
(1)三元组链表 用链表存储的三元组线性表。
(2)行指针数组结构的三元组链表 把每行非零元素三元组组织成一个单链表,再设计一个指针类型的数组存储所有单 链表的头指针。
a11 c … c a21 a22 … c ………………
c c … a nn
an1 an2 … an n
(a)上三角矩阵 (b)下三角矩阵
第16页/共31页
假设以一维数组sa作为n阶下三角矩阵A的压缩存储单元,k为一维数组va的下
标序号,aij为n阶下三角矩阵A中i行j列的数据元素(其中1≤i,j≤n ),其数学映射关 系为:
第7页/共31页
void Diliver2DArray(int **a, int row) { int i;
for(i = 0; i < row; i++) free(a[i]);
free(a); }
#include <malloc.h> #include <stdio.h> #include <stdlib.h> #include “Array.h”
a0的内存单元地址
每个元素所需的字节个数
(2)、一个m行n列的二维数组
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档