没有合适的资源?快使用搜索试试~ 我知道了~
数据结构C实现代码
需积分: 13 5 下载量 93 浏览量
2018-12-28
10:40:35
上传
评论
收藏 324KB PDF 举报
温馨提示
顺序表、链表、栈、队列、树、图的C实现。 (线性表顺序存储) #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 20 /* 存储空间初始分配量*/ typedef int Status; /* Status 是函数的类型,其值 是函数结果状态代码,如OK 等*/ typedef int ElemType; /* ElemType 类型根据实际 情况而定,这里假设为int */ Status visit(ElemType c) { printf("%d ",c); return OK; } typedef struct { ElemType data[MAXSIZE]; /* 数组,存储数 据元素*/ int length; /* 线性表当前长度*/ }SqList;
资源推荐
资源详情
资源评论
第 1 页 共 51 页
( 线性表顺序存储)
#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 20 /* 存储空间初始分配量 */
typedef
int
Status; /* Status 是函数的类型 , 其值
是函数结果状态代码,如 OK 等 */
typedef
int
ElemType; /* ElemType 类型根据实际
情况而定,这里假设为
int
*/
Status visit(ElemType c)
{
printf("%d ",c);
return OK;
}
typedef struct
{
ElemType data[MAXSIZE]; /* 数组 , 存储数
据元素 */
int
length; /*
线性表当前长度 */
}SqList;
/* 初始化顺序线性表 */
Status InitList(SqList *L)
{
L->length=0;
return OK;
}
/* 初始条件:顺序线性表 L 已存在。操作结果:若 L 为
空表,则返回 TRUE ,否则返回 FALSE */
Status ListEmpty(SqList L)
{
if(L.length==0)
return TRUE;
else
return FALSE;
}
/* 初始条件:顺序线性表 L 已存在。操作结果:将 L 重
置为空表 */
Status ClearList(SqList *L)
{
L->length=0;
return OK;
}
/* 初始条件:顺序线性表 L 已存在。操作结果:返回
L
中数据元素个数 */
int
ListLength(SqList L)
{
return L.length;
}
/* 初始条件 : 顺序线性表 L 已存在 , 1 ≤
i
≤ ListLength(L) */
/* 操作结果:用 e 返回 L 中第 i 个数据元素的值 , 注意
i
是指位置,第 1 个位置的数组是从 0 开始 */
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0 || i<1 || i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
/* 初始条件:顺序线性表 L 已存在 */
/* 操作结果:返回 L 中第 1 个与 e 满足关系的数据元素
的位序。 */
/* 若这样的数据元素不存在,则返回值为 0 */
int
LocateElem(SqList L,ElemType e)
{
int
i;
if
(L.length==0)
return 0;
for(i=0;i<L.length;i++)
{
if
(L.data[i]==e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
/* 初始条件 : 顺序线性表 L 已存在 ,1 ≤
i
≤ ListLength(L) , */
/* 操作结果 : 在
L
中 第
i
个位置之前插入新的数据元 素 e
,
L 的长度加 1 */
Status ListInsert(SqList *L,int i,ElemType e)
{
int
k;
if
(L->length==MAXSIZE) /* 顺序线性表已经满
*/
return ERROR;
if
(i<1 || i>L->length+1)/* 当 i 比第一位置小或者比
最后一位置后一位置还要大时 */
return ERROR;
if
(i<=L->length) /* 若插入数据位置不在表
尾 */
{
for(k=L->length-1;k>=i-1;k--) /* 将要插入位
置之后的数据元素向后移动一位 */
第 2 页 共 51 页
L->data[k+1]=L->data[k];
}
L->data[i-1]=e; /* 将新元素插入 */
L->length++;
return OK;
}
/* 初始条件 : 顺序线性表 L 已存在 , 1 ≤
i
≤ ListLength(L) */
/* 操作结果 : 删除 L 的第 i 个数据元素 , 并用 e 返回其值
,
L 的长度减 1 */
Status ListDelete(SqList *L,int i,ElemType *e)
{
int
k;
if
(L->length==0) /* 线性表为空 */
return ERROR;
if
(i<1 || i>L->length) /* 删除位置不正确
*/
return ERROR;
*e=L->data[i-1];
if
(i<L->length) /* 如果删除不是
最后位置 */
{
for(k=i;k<L->length;k++)/* 将删除位置后继元
素前移 */
L->data[k-1]=L->data[k];
}
L->length--;
return OK;
}
/* 初始条件:顺序线性表 L 已存在 */
/* 操作结果:依次对 L 的每个数据元素输出 */
Status ListTraverse(SqList L)
{
int
i;
for(i=0;i<L.length;i++)
visit(L.data[i]);
printf("\n");
return OK;
}
void unionL(SqList *La,SqList Lb)
{
int
La_len,Lb_len,i;
ElemType e;
La_len=ListLength(*La);
Lb_len=ListLength(Lb);
for (i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);
if
(!LocateElem(*La,e))
ListInsert(La,++La_len,e);
}
}
int
main()
{
SqList L;
SqList Lb;
ElemType e;
Status
i;
int
j,k;
i=InitList(&L);
printf(" 初始化 L 后: L.length=%d\n",L.length);
for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf(" 在 L 的表头依次插入 1 ~ 5 后: L.data=");
ListTraverse(L);
printf("L.length=%d \n",L.length);
i=ListEmpty(L);
printf("L 是否空: i=%d(1: 是
0:
否 )\n",i);
i=ClearList(&L);
printf(" 清空 L 后: L.length=%d\n",L.length);
i=ListEmpty(L);
printf("L 是否空: i=%d(1: 是
0:
否 )\n",i);
for(j=1;j<=10;j++)
ListInsert(&L,j,j);
printf(" 在 L 的表尾依次插入 1 ~ 10 后: L.data=");
ListTraverse(L);
printf("L.length=%d \n",L.length);
ListInsert(&L,1,0);
printf(" 在 L 的表头插入 0 后: L.data=");
ListTraverse(L);
printf("L.length=%d \n",L.length);
GetElem(L,5,&e);
printf(" 第 5 个元素的值为: %d\n",e);
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf(" 第 %d 个元素的值为
%d\n",k,j);
else
printf(" 没有值为 %d 的元素 \n",j);
}
k=ListLength(L); /* k 为表长 */
for(j=k+1;j>=k;j--)
{
i=ListDelete(&L,j,&e); /* 删除第 j 个数据
*/
if(i==ERROR)
printf(" 删除第 %d 个数据失败
\n",j);
else
printf(" 删除第 %d 个的元素值为:
%d\n",j,e);
}
printf(" 依次输出 L 的元素: ");
ListTraverse(L);
j=5;
第 3 页 共 51 页
ListDelete(&L,j,&e); /* 删除第 5 个数据 */
printf(" 删除第 %d 个的元素值为: %d\n",j,e);
printf(" 依次输出 L 的元素: ");
ListTraverse(L);
// 构造一个有 10 个数的 Lb
i=InitList(&Lb);
for(j=6;j<=15;j++)
i=ListInsert(&Lb,1,j);
unionL(&L,Lb);
printf(" 依次输出合并了 Lb 的 L 的元素: ");
ListTraverse(L);
system("pause");
return 0;
}
( 线性表链式存储)
####### 开头省略
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef
int
Status;/* Status 是函数的类型 , 其值是函数结果
状态代码,如 OK 等 */
typedef
int
ElemType;/* ElemType 类型根据实际情况而
定,这里假设为
int
*/
Status visit(ElemType c)
{
printf("%d ",c);
return OK;
}
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList; /* 定义 LinkList */
/* 初始化顺序线性表 */
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node)); /* 产生头结点 , 并
使 L 指向此头结点 */
if(!(*L)) /* 存储分配失败 */
return ERROR;
(*L)->next=NULL; /* 指针域为空 */
return OK;
}
/* 初始条件:顺序线性表 L 已存在。操作结果:若 L 为
空表,则返回 TRUE ,否则返回 FALSE */
Status ListEmpty(LinkList L)
{
if(L->next)
return FALSE;
else
return 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
中数据元素个数 */
int
ListLength(LinkList L)
{
int
i=0;
LinkList p=L->next; /* p 指向第一个结点 */
while(p)
{
i++;
p=p->next;
}
return
i;
}
/* 初始条件 : 顺序线性表 L 已存在 , 1 ≤
i
≤ ListLength(L) */
/* 操作结果:用 e 返回 L 中第 i 个数据元素的值 */
Status GetElem(LinkList L,int i,ElemType *e)
{
int
j;
LinkList p; /* 声明一结点 p */
第 4 页 共 51 页
p = L->next; /* 让 p 指向链表 L 的第一个
结点 */
j
= 1; /* j 为计数器 */
while (p && j<i) /* p 不为空或者计数 器
j
还没有等
于 i 时,循环继续 */
{
p = p->next; /* 让 p 指向下一个结点 */
++j;
}
if
( !p || j>i )
return ERROR; /* 第 i 个元素不存在 */
*e = p->data; /* 取第 i 个元素的数据 */
return OK;
}
/* 初始条件:顺序线性表 L 已存在 */
/* 操作结果:返回 L 中第 1 个与 e 满足关系的数据元素
的位序。 */
/* 若这样的数据元素不存在,则返回值为 0 */
int
LocateElem(LinkList L,ElemType e)
{
int
i=0;
LinkList p=L->next;
while(p)
{
i++;
if(p->data==e) /* 找到这样的数据元素 */
return
i;
p=p->next;
}
return 0;
}
/* 初始条件 : 顺序线性表 L 已存在 ,1 ≤
i
≤ ListLength(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
<
i)
/* 寻找第 i 个结点 */
{
p = p->next;
++j;
}
if
(!p ||
j
>
i)
return 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 已存在 , 1 ≤
i
≤ ListLength(L) */
/* 操作结果 : 删除 L 的第 i 个数据元素 , 并用 e 返回其值
,
L 的长度减 1 */
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int
j;
LinkList p,q;
p = *L;
j
= 1;
while (p->next &&
j
<
i)
/* 遍历寻找第 i 个元素
*/
{
p = 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 已存在 */
/* 操作结果:依次对 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(sizeof(Node));
(*L)->next = NULL; /* 先
建立一个带头结点的单链表 */
for (i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node)); /* 生成新
结点 */
p->data = rand()%100+1; /* 随
机生成 100 以内的数字 */
p->next = (*L)->next;
第 5 页 共 51 页
(*L)->next = p; /*
插入到表头 */
}
}
/* 随机产生 n 个元素的值 , 建立带表头结点的单链线性
表
L
(尾插法) */
void CreateListTail(LinkList *L,
int
n)
{
LinkList p,r;
int
i;
srand(time(0)); /* 初始化
随机数种子 */
*L = (LinkList)malloc(sizeof(Node)); /*
L
为整个线性
表 */
r=*L; /* r 为指
向尾部的结点 */
for (i=0; i<n; i++)
{
p = (Node *)malloc(sizeof(Node)); /* 生成新
结点 */
p->data = rand()%100+1; /* 随机
生成 100 以内的数字 */
r->next=p; /* 将表
尾终端结点的指针指向新结点 */
r = p; /* 将当
前的新结点定义为表尾终端结点 */
}
r->next = NULL; /* 表示
当前链表结束 */
}
int
main()
{
LinkList L;
ElemType e;
Status
i;
int
j,k;
i=InitList(&L);
printf(" 初始化 L 后:
ListLength(L)=%d\n",ListLength(L));
for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf(" 在 L 的表头依次插入 1 ~ 5 后: L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
i=ListEmpty(L);
printf("L 是否空: i=%d(1: 是
0:
否 )\n",i);
i=ClearList(&L);
printf(" 清 空
L
后 : ListLength(L)=%d\n",ListLength(L));
i=ListEmpty(L);
printf("L 是否空: i=%d(1: 是
0:
否 )\n",i);
for(j=1;j<=10;j++)
ListInsert(&L,j,j);
printf(" 在 L 的表尾依次插入 1 ~ 10 后: L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
ListInsert(&L,1,0);
printf(" 在 L 的表头插入 0 后: L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
GetElem(L,5,&e);
printf(" 第 5 个元素的值为: %d\n",e);
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf(" 第 %d 个元素的值为
%d\n",k,j);
else
printf(" 没有值为 %d 的元素 \n",j);
}
k=ListLength(L); /* k 为表长 */
for(j=k+1;j>=k;j--)
{
i=ListDelete(&L,j,&e); /* 删除第 j 个数据
*/
if(i==ERROR)
printf(" 删除第 %d 个数据失败
\n",j);
else
printf(" 删除第 %d 个的元素值为:
%d\n",j,e);
}
printf(" 依次输出 L 的元素: ");
ListTraverse(L);
j=5;
ListDelete(&L,j,&e); /* 删除第 5 个数据 */
printf(" 删除第 %d 个的元素值为: %d\n",j,e);
printf(" 依次输出 L 的元素: ");
ListTraverse(L);
i=ClearList(&L);
printf("\n 清空 L 后:
ListLength(L)=%d\n",ListLength(L));
CreateListHead(&L,20);
printf(" 整体创建 L 的元素 ( 头插法 ) : ");
ListTraverse(L);
i=ClearList(&L);
printf("\n 删除 L 后:
ListLength(L)=%d\n",ListLength(L));
CreateListTail(&L,20);
printf(" 整体创建 L 的元素 ( 尾插法 ) : ");
ListTraverse(L);
system("pause");
return 0;
}
剩余50页未读,继续阅读
资源评论
随心而码
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (174538016)downloading-Python基于深度学习和opencv的车牌识别系统.zip
- okio-2.8.0工具包
- (175360432)2储能的微电网优化调度问题
- (175396234)python实现车牌识别的示例代码.pdf
- okhttp-4.9.3工具包
- (175683250)微信小程序完美购物车抛物线(飞入效果)+ 回到顶部
- (175919248)基于python的深度学习车牌识别系统源码数据库论文.docx
- 项目费用管理看板.xlsx
- 【SOP】视频号思维导图.pdf
- 企业员工30天考勤表.xlsx
- 65个思维模型地图.pdf
- (176101808)西门子S7-1500PLC与西门子V90 PN伺服通讯控制项 西门子S7-1500PLC与西门子V90 PN伺服通讯控制项目程序
- 基于 Qt 4 + Mysql数据库成员管理系统,详细文档+全部资料+高分项目.zip
- 毕业设计-基于Qt Qwidget的学生管理系统,详细文档+全部资料+高分项目.zip
- 基于 Qt 的快递管理系统 CMake 版本详细文档+全部资料+高分项目.zip
- 基于 Qt 的机械臂操作系统 —— Arduino、四轴桌面电动机械臂、Qt 开发上位机、USB 串口通信详细文档+全部资料+高分项目.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功