收藏 分享(赏)

大话数据结构源代码.docx

上传人:buyk185 文档编号:6213497 上传时间:2019-04-02 格式:DOCX 页数:130 大小:451.90KB
下载 相关 举报
大话数据结构源代码.docx_第1页
第1页 / 共130页
大话数据结构源代码.docx_第2页
第2页 / 共130页
大话数据结构源代码.docx_第3页
第3页 / 共130页
大话数据结构源代码.docx_第4页
第4页 / 共130页
大话数据结构源代码.docx_第5页
第5页 / 共130页
点击查看更多>>
资源描述

1、第 一 章 线 性 表1. 01 线 性 表 顺 序 存 储 _List#include “stdio.h“#include “stdlib.h“#include “io.h“#include “math.h“#include “time.h“#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20 /* 存 储空间 初始 分配 量 */typedef int Status; /* Status 是函数 的类 型, 其值是 函数 结果 状态 代码 ,如OK 等 */typedef int ElemTyp

2、e; /* ElemType 类型 根据 实际 情 况而 定, 这里 假设 为 int*/Status visit(ElemType c)printf(“%d “,c);return OK;typedef structElemType dataMAXSIZE; /* 数组 ,存 储数 据 元素 */int length; /* 线 性表 当 前长 度 */SqList;/* 初 始化 顺序 线性 表 * / Status InitList(SqList *L)L-length=0;return OK;/* 初 始条 件: 顺序 线性表 L 已存在 。操 作结 果:若 L 为空 表 ,则 返回

3、TRUE, 否则 返回 FALSE */Status ListEmpty(SqList L)if(L.length=0)return TRUE;elsereturn FALSE;/* 初 始条 件: 顺序 线性 表 L 已存 在。 操作 结果 :将 L 重置 为 空表 */Status ClearList(SqList *L)L-length=0;return OK;/* 初 始条 件: 顺序 线性 表 L 已存 在。 操作 结果 :返 回 L 中 数据 元素 个数 */int ListLength(SqList L)return L.length;/* 初 始条 件: 顺序 线性 表 L 已

4、存 在, 1i Lis tLength(L) */* 操 作结 果: 用 e 返回 L 中第 i 个数 据元 素的 值, 注 意 i 是 指位 置, 第 1 个位 置 的数 组是 从 0 开始 */Status GetElem(SqList L,int i,ElemType *e)if(L.length=0 | iL.length)return ERROR;*e=L.datai-1;return OK;/* 初 始条 件: 顺序 线性 表 L 已存 在 * /* 操 作结 果: 返回 L 中 第 1 个 与 e 满足 关系 的数 据 元素的 位序 。 */* 若 这样 的数 据元 素不 存 在

5、,则 返回 值 为 0 */int LocateElem(SqList L,ElemType e)int i;if (L.length=0)return 0;for(i=0;i=L.length)return 0;return i+1;/* 初 始条 件: 顺序 线性 表 L 已存 在, 1i Li stLength(L), */* 操 作结 果: 在 L 中第 i 个位置 之前 插入 新的 数据 元素 e,L 的长 度加 1 */ Status ListInsert(SqList *L,int i,ElemType e)int k;if (L-length=MAXSIZE) /* 顺 序 线

6、性 表已 经满 */return ERROR;if (iL-length+1)/* 当 i 比 第一 位置 小或 者比 最后一 位置 后一 位置 还要 大 时*/return ERROR;if (ilength) /* 若插 入数 据位 置不 在表 尾 */for(k=L-length-1;k=i-1;k-) /* 将 要 插 入 位 置 之 后 的 数 据 元 素 向 后 移 动 一 位*/L-datak+1=L-datak;L-datai-1=e; /* 将 新元 素插 入 */ L-length+;return OK;/* 初 始条 件: 顺序 线性 表 L 已存 在, 1i Lis t

7、Length(L) */* 操 作结 果: 删除 L 的 第 i 个数 据元 素,并 用 e 返 回 其值, L 的 长度 减 1 */ Status ListDelete(SqList *L,int i,ElemType *e)int k;if (L-length=0) /* 线性 表为 空 */return ERROR;if (iL-length) /* 删 除位 置不 正 确 */return ERROR;*e=L-datai-1;if (ilength) /* 如果 删除 不 是最后 位置 */for(k=i;klength;k+)/* 将删 除位 置后 继元 素前移 */ L-dat

8、ak-1=L-datak;L-length-;return OK;/* 初 始条 件: 顺序 线性 表 L 已存 在 * /* 操 作结 果: 依次 对 L 的 每个 数 据元 素输 出 */ Status ListTraverse(SqList L)int i;for(i=0;i=k;j-)i=ListDelete( /* 删除 第 j 个 数 据 */if(i=ERROR)elseprintf(“删除 第%d 个数 据失 败 n“,j);printf(“删除 第%d 个的 元素 值 为:%d n“,j,e);printf(“依 次输 出 L 的 元素:“ ); ListTraverse(L

9、);j=5;ListDelete( /* 删除 第 5 个数 据 */printf(“删 除第 %d 个 的 元素值 为: %dn“,j,e);printf(“依 次输 出 L 的 元素:“ ); ListTraverse(L);/构造 一个 有 10 个数 的 LbSqList Lb; i=InitList( for(j=6;jnext=NULL; /* 指 针域为 空 */return OK;/* 初 始条 件: 顺序 线性 表 L 已 存 在。 操作 结果 : 若 L 为空表 , 则 返 回 TRUE, 否 则返 回 FALSE*/Status ListEmpty(LinkList L)

10、if(L-next)return FALSE;elsereturn TRUE;/* 初 始条 件: 顺序 线性 表 L 已存 在。 操作 结果 :将 L 重置 为 空表 */Status ClearList(LinkList *L)LinkList p,q;p=(*L)-next; /* p 指向 第一 个结 点 */while(p) /* 没到 表尾 */q=p-next; free(p); p=q;(*L)-next=NULL; /* 头 结点 指针 域为 空 */return OK;/* 初 始条 件: 顺序 线性 表 L 已存 在。 操作 结果 :返 回 L 中 数据 元素 个数 */

11、int ListLength(LinkList L)int i=0;LinkList p=L-next; /* p 指向第 一个 结点 */while(p)i+;p=p-next;return i;/* 初 始条 件: 顺序 线性 表 L 已存 在, 1i Lis tLength(L) */* 操 作结 果: 用 e 返 回 L 中第 i 个数 据元 素的 值 */ Status GetElem(LinkList L,int i,ElemType *e)int j;LinkList p; /* 声 明一 结点 p */p = L-next; /* 让 p 指 向链 表 L 的第 一 个结点 *

12、/j = 1; /* j 为计 数器 */while (p /* 让 p 指 向 下一 个 结点 */+j;if ( !p | ji )return ERROR; /* 第 i 个 元素 不 存在 */*e = p-data; /* 取 第 i 个元 素 的数 据 */return OK;/* 初 始条 件: 顺序 线性 表 L 已存 在 * /* 操 作结 果: 返回 L 中 第 1 个 与 e 满足 关系 的数 据 元素的 位序 。 */* 若 这样 的数 据元 素不 存 在,则 返回 值 为 0 */int LocateElem(LinkList L,ElemType e)int i=0

13、;LinkList p=L-next;while(p)i+;if(p-data=e) /* 找到这 样的 数据 元素 */return i;p=p-next;return 0;/* 初 始条 件: 顺序 线性 表 L 已存 在, 1i Li stLength(L), */* 操 作结 果: 在 L 中第 i 个位置 之前 插入 新的 数据 元素 e,L 的长 度加 1 */ Status ListInsert(LinkList *L,int i,ElemType e)int j;LinkList p,s;p = *L;j = 1;while (p +j;if (!p | j i)return

14、ERROR; /* 第 i 个 元素不 存在 */s = (LinkList)malloc(sizeof(Node); /* 生成 新结 点( C 语言 标 准函 数) */s-data = e;s-next = p-next; /* 将 p 的 后继 结点 赋值 给 s 的后继 */p-next = s; /* 将 s 赋 值给 p 的后 继 * /return OK;/* 初 始条 件: 顺序 线性 表 L 已存 在, 1i Lis tLength(L) */* 操 作结 果: 删除 L 的 第 i 个数 据元 素,并 用 e 返 回 其值, L 的 长度 减 1 */ Status Li

15、stDelete(LinkList *L,int i,ElemType *e)int j;LinkList p,q;p = *L;j = 1;while (p-next +j;if (!(p-next) | j i)return ERROR; /* 第 i 个元 素不 存在 */q = p-next;p-next = q-next; /* 将 q 的 后继 赋值 给 p 的 后继 */*e = q-data; /* 将 q 结点 中的 数据 给 e */free(q); /* 让 系统 回收 此结 点 ,释放 内存 */return OK;/* 初 始条 件: 顺序 线性 表 L 已存 在 *

16、 /* 操 作结 果: 依次 对 L 的 每个 数 据元 素输 出 */ Status ListTraverse(LinkList L)LinkList p=L-next;while(p)visit(p-data);p=p-next;printf(“n“);return OK;/* 随机 产生 n 个元 素的 值,建 立带 表头 结点 的单 链线性 表 L(头 插法 ) * /void CreateListHead(LinkList *L, int n)LinkList p;int i;srand(time(0); /* 初始 化 随机数 种子 */*L = (LinkList)malloc(

17、sizeof(Node);(*L)-next = NULL; /* 先 建 立一个 带头 结点 的单 链表 */for (i=0; idata = rand()%100+1; /* 随 机生 成 100 以内 的数 字 */p-next = (*L)-next;(*L)-next = p; /* 插入 到表 头 */* 随机 产生 n 个元 素的 值,建 立带 表头 结点 的单 链线性 表 L(尾 插法 ) * /void CreateListTail(LinkList *L, int n)LinkList p,r;int i;srand(time(0); /* 初 始化 随 机数 种 子 *

18、/*L = (LinkList)malloc(sizeof(Node); /* L 为 整个 线性 表 */r=*L; /* r 为 指向 尾部 的 结点 */for (i=0; idata = rand()%100+1; /* 随机 生成 100 以 内的 数字 */r-next=p; /* 将表 尾终 端 结点 的 指针 指向 新结 点 */r = p; /* 将当 前的 新 结点定 义为 表尾 终端 结点 */r-next = NULL; /* 表示 当 前链表 结束 */int main()LinkList L; ElemType e; Status i;int j,k;i=InitL

19、ist(printf(“初 始化 L 后 : ListLength(L)=%dn“,ListLength(L);for(j=1;j=k;j-)i=ListDelete( /* 删除 第 j 个 数 据 */if(i=ERROR)printf(“删除 第%d 个数 据失 败 n“,j);elseprintf(“删除 第%d 个的 元素 值 为:%d n“,j,e);printf(“依 次输 出 L 的 元素: “); ListTraverse(L);j=5;ListDelete( /* 删除 第 5 个数 据 */printf(“删 除第 %d 个 的 元素值 为: %dn“,j,e);prin

20、tf(“依 次输 出 L 的 元素: “); ListTraverse(L);i=ClearList(printf(“n 清 空 L 后: ListLength(L)=%dn“,ListLength(L); CreateListHead(printf(“整 体创 建 L 的 元素 (头插 法) :“ ); ListTraverse(L);i=ClearList(printf(“n 删 除 L 后: ListLength(L)=%dn“,ListLength(L); CreateListTail(printf(“整 体创 建 L 的 元素 (尾插 法) :“ ); ListTraverse(L)

21、;return 0;03 静 态 链 表 _StaticLinkList#include “string.h“#include “ctype.h“#include “stdio.h“#include “stdlib.h“#include “io.h“#include “math.h“#include “time.h“#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 1000 /* 存储 空 间初 始分 配量 */typedef int Status; /* Status 是函数的 类型 ,其值是 函数

22、 结果 状态 代码 , 如 OK 等 */typedef char ElemType; /* ElemType 类 型根 据 实际情 况而 定, 这里 假设 为 char */Status visit(ElemType c)printf(“%c “,c);return OK;/* 线 性表 的静 态链 表存 储 结构 */typedef structElemType data;int cur; /* 游 标 (Cursor) ,为 0 时 表示 无指 向 */ Component,StaticLinkListMAXSIZE;/* 将 一维 数组 space 中 各 分量链 成一 个备 用链 表

23、 , space0.cur 为头 指针 , “0“表 示空指 针 */ Status InitList(StaticLinkList space)int i;for (i=0; i ListLength(L) + 1)return ERROR;j = Malloc_SSL(L); /* 获得 空 闲 分量 的下 标 * /if (j)Lj.data = e; /* 将 数据 赋值给 此分 量 的 data */for(l = 1; l ListLength(L)return ERROR;k = MAXSIZE - 1;for (j = 1; j top=-1;return OK;/* 把 S

24、置为 空栈 */Status ClearStack(SqStack *S)S-top=-1;return OK;/* 若 栈 S 为 空栈 ,则 返回 TRUE, 否则 返 回 FALSE */Status StackEmpty(SqStack S)if (S.top=-1)return TRUE;elsereturn FALSE;/* 返 回 S 的 元素 个数 ,即 栈的长 度 */int StackLength(SqStack S)return S.top+1;/* 若 栈不 空, 则用 e 返回 S 的栈顶 元素 ,并 返回 OK;否则 返 回 ERROR */Status GetTo

25、p(SqStack S,SElemType *e)if (S.top=-1)return ERROR;else*e=S.dataS.top;return OK;/* 插 入元 素 e 为 新的 栈顶 元素 */Status Push(SqStack *S,SElemType e)if(S-top = MAXSIZE -1) /* 栈 满 */return ERROR;S-top+; /* 栈 顶指 针增 加一 */S-dataS-top=e; /* 将新 插 入 元素 赋值 给 栈顶空 间 */return OK;/* 若 栈不 空, 则删 除 S 的 栈顶元 素, 用 e 返 回其 值 ,并

26、返 回 OK; 否则 返回 ERROR */Status Pop(SqStack *S,SElemType *e)if(S-top=-1)return ERROR;*e=S-dataS-top; /* 将 要删 除的 栈顶 元素 赋 值给 e */ S-top-; /* 栈 顶指 针减 一 * /return OK;/* 从 栈底 到栈 顶依 次对 栈 中每个 元素 显示 */Status StackTraverse(SqStack S)int i; i=0; while(itop1=-1;S-top2=MAXSIZE;return OK;/* 把 S 置为 空栈 */Status Clear

27、Stack(SqDoubleStack *S)S-top1=-1;S-top2=MAXSIZE;return OK;/* 若 栈 S 为 空栈 ,则 返回 TRUE, 否则 返 回 FALSE */Status StackEmpty(SqDoubleStack S)if (S.top1=-1 elsereturn FALSE;/* 返 回 S 的 元素 个数 ,即 栈的长 度 */int StackLength(SqDoubleStack S)return (S.top1+1)+(MAXSIZE-1-S.top2);/* 插 入元 素 e 为 新的 栈顶 元素 */Status Push(Sq

28、DoubleStack *S,SElemType e,int stackNumber)if (S-top1+1=S-top2) /* 栈 已满 ,不 能再 push 新元素 了 */return ERROR;if (stackNumber=1) /* 栈 1 有元 素进 栈 * /S-data+S-top1=e; /* 若是 栈 1 则先 top1+1 后给 数组 元素 赋值。 */else if (stackNumber=2) /* 栈 2 有元 素进 栈 * /S-data-S-top2=e; /* 若是 栈 2 则 先 top2-1 后 给数 组元 素 赋 值。 */return OK;

29、/* 若 栈不 空, 则删 除 S 的 栈顶元 素, 用 e 返 回其 值 ,并返 回 OK; 否则 返回 ERROR */Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)if (stackNumber=1)if (S-top1=-1)return ERROR; /* 说 明栈 1 已 经是 空栈 ,溢 出 * /*e=S-dataS-top1-; /* 将 栈 1 的 栈顶元 素出 栈 */else if (stackNumber=2)if (S-top2=MAXSIZE)return ERROR; /* 说 明栈 2 已 经

30、是 空栈 ,溢 出 * /*e=S-dataS-top2+; /* 将 栈 2 的栈顶 元素 出栈 */return OK;Status StackTraverse(SqDoubleStack S)int i; i=0; while(i=MAXSIZE-2;j-) Push(printf(“栈 中元 素 依次为 :“ );StackTraverse(s);printf(“当 前栈 中 元素有 :%d n“,StackLength(s); Pop(printf(“弹 出的 栈 顶元素 e=%dn“,e);printf(“栈 空否 :% d(1:空 0:否 )n“,StackEmpty(s);fo

31、r(j=6;jtop = (LinkStackPtr)malloc(sizeof(StackNode);if(!S-top)return ERROR; S-top=NULL;S-count=0;return OK;/* 把 S 置为 空栈 */Status ClearStack(LinkStack *S)LinkStackPtr p,q; p=S-top; while(p)q=p;p=p-next;free(q);S-count=0;return OK;/* 若 栈 S 为 空栈 ,则 返回 TRUE, 否则 返 回 FALSE */Status StackEmpty(LinkStack S)

32、if (S.count=0)return TRUE;elsereturn FALSE;/* 返 回 S 的 元素 个数 ,即 栈的长 度 */int StackLength(LinkStack S)return S.count;/* 若 栈不 空, 则用 e 返回 S 的栈顶 元素 ,并 返回 OK;否则 返 回 ERROR */Status GetTop(LinkStack S,SElemType *e)if (S.top=NULL)return ERROR;else*e=S.top-data;return OK;/* 插 入元 素 e 为 新的 栈顶 元素 */Status Push(Li

33、nkStack *S,SElemType e)LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode);s-data=e;s-next=S-top; /* 把 当前 的栈 顶元 素赋 值 给新结 点的 直接 后继 ,见 图中 */ S-top=s; /* 将新 的结 点 s 赋 值给 栈顶指 针, 见图 中 */S-count+;return OK;/* 若 栈不 空, 则删 除 S 的 栈顶元 素, 用 e 返 回其 值 ,并返 回 OK; 否则 返回 ERROR */Status Pop(LinkStack *S,SElemType *e)

34、LinkStackPtr p;if(StackEmpty(*S)return ERROR;*e=S-top-data;p=S-top; /* 将 栈顶 结点 赋值 给 p, 见图中 */S-top=S-top-next; /* 使 得栈 顶指 针下 移一位 ,指 向 后 一结 点, 见图中 */free(p); /* 释 放结 点 p */ S-count-;return OK;Status StackTraverse(LinkStack S)LinkStackPtr p; p=S.top; while(p)visit(p-data);p=p-next;int main()printf(“n“

35、);return OK;int j; LinkStack s; int e;if(InitStack(jfront=0; Q-rear=0; return OK;/* 将 Q 清 为空 队列 */Status ClearQueue(SqQueue *Q)Q-front=Q-rear=0;return OK;/* 若 队列 Q 为 空队 列,则 返回 TRUE,否则 返回 FALSE */Status QueueEmpty(SqQueue Q)if(Q.front=Q.rear) /* 队列 空的标 志 */return TRUE;elsereturn FALSE;/* 返 回 Q 的元 素个

36、数, 也 就是队 列的 当前 长度 */int QueueLength(SqQueue Q)return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;/* 若 队列 不空 ,则 用 e 返 回 Q 的 队头 元素, 并返 回 OK,否 则返 回 ERROR */Status GetHead(SqQueue Q,QElemType *e)if(Q.front=Q.rear) /* 队列 空 */return ERROR;*e=Q.dataQ.front;return OK;/* 若 队列 未满 ,则 插入 元 素 e 为 Q 新的 队尾 元素 */Status EnQueu

37、e(SqQueue *Q,QElemType e)if (Q-rear+1)%MAXSIZE = Q-front) /* 队 列满 的判 断 * /return ERROR;Q-dataQ-rear=e; /* 将 元素 e 赋值 给队 尾 * /Q-rear=(Q-rear+1)%MAXSIZE;/* rear 指针 向后 移一 位 置, */* 若 到最 后则 转到 数组 头 部 */return OK;/* 若 队列 不空 ,则 删除 Q 中队头 元素 , 用 e 返回 其 值 */Status DeQueue(SqQueue *Q,QElemType *e)if (Q-front =

38、Q-rear) /* 队 列空 的判 断 * /return ERROR;*e=Q-dataQ-front; /* 将 队头 元素 赋值 给 e */Q-front=(Q-front+1)%MAXSIZE; /* front 指 针向 后移一 位置 , */* 若 到最 后则 转到 数组 头 部 */return OK;/* 从 队头 到队 尾依 次对 队 列 Q 中 每个 元素 输出 */Status QueueTraverse(SqQueue Q)int i; i=Q.front; while(i+Q.front)!=Q.rear)visit(Q.datai);i=(i+1)%MAXSIZ

39、E;printf(“n“);return OK;int main()Status j;int i=0,l;QElemType d; SqQueue Q; InitQueue(printf(“初 始化 队列 后, 队 列空否 ?%u (1:空 0:否) n“,QueueEmpty(Q);printf(“请 输入 整型 队列 元 素( 不 超过 %d 个) ,-1 为提 前 结束符 : “,MAXSIZE-1);do/* scanf(“%d“, */d=i+100;if(d=-1)break;i+; EnQueue(while(i0)printf(“现 在由 队头 删除 %d 个元素 :n“,l-2);while(QueueLength(Q)2)DeQueue(printf(“删 除的 元素 值为 %dn“,d);j=GetHead(Q,if(j)printf(“现 在队 头元 素为 : %dn“,d); ClearQueue(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报