c语言函数实现顺序线性表,数据结构C语言实现——顺序线性表SqList
delcaration.h
#ifndef DECLARATION_H_INCLUDED
#define DECLARATION_H_INCLUDED
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define ElemType int
typedef int Status;
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
#endif // DECLARATION_H_INCLUDEDfunction.h
#ifndef FUNCTION_H_INCLUDED
#define FUNCTION_H_INCLUDED
Status InitList_Sq(SqList *L);
//构造一个空的线性表L
Status DestroyList_Sq(SqList *L);
//初始条件:线性表已存在;操作结果:销毁线性表L
Status ClearList_Sq(SqList *L);
//初始条件:线性表已存在;操作结果:将线性表L置为空表
Status ListEmpty_Sq(SqList L);
//初始条件:线性表已存在;操作结果:若L为空表则返回TRUE否则返回ERROR
Status ListLength_Sq(SqList L);
//初始条件:线性表已存在;操作结果:返回L中元素的个数
Status GetElem_Sq(SqList L, int i, ElemType *e);
//初始条件:线性表已存在,1<=i<=ListLength_Sq(L);操作结果:用e返回L中第i个元素的值
Status LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType, ElemType));
//初始条件:线性表已存在,compare()是数据元素判定函数;
//操作结果:返回L中第1个与e满足compare()关系的数据元素的位序。若这样的数不存在则返回值为0。
Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType * pre_e);
//初始条件:线性表L已存在
//操作结果:若cur_e是L的元素,且不是第一个,则用pre_e返回它的前驱。否则操作失败,pre_e无定义
Status NextElem_Sq(SqList L, ElemType cur_e, ElemType *next_e);
//初始条件:线性表L已存在
//操作结果:若cur_e是L的数据,且不是最后一个,则用next_e返回它的后继。否则操作失败,next_e无定义
Status ListInsert_Sq(SqList *L, ElemType i, ElemType e);
//初始条件:线性表你已存在,1<=i<=ListLength_Sq(L)+1
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
Status ListDelete_Sq(SqList *L, ElemType i, ElemType *e);
//初始条件:线性表你已存在,1<=i<=ListLength_Sq(L)+1
//操作结果:删除L中第i个数据元素,并用e返回其值,L的长度减1
Status ListTraverse_Sq(SqList L, void (*visit) (void const *));
//初始条件:线性表 L已存在
//操作结果:依次对L的每个数据元素调用visit()函数。一旦visit()失败,则操作失败
void visit_print(void const *e);
//输出地址e所指向内存的值
void Union_Sq(SqList *La, SqList Lb);
//将存在于Lb中而不在La中的数据插入到La中去
Status compare_Elem(ElemType a, ElemType b);
//比较a,b的大小,若相等则返回1,否则返回0
void MergeList_Sq(SqList *La, SqList Lb,SqList *Lc);
//初始条件:已知顺序线性表La和Lb的元素按值非递减排列
//操作结果:归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列
#endif // FUNCTION_H_INCLUDEDfunction.c
#include
#include
#include "declaration.h"
Status compare_Elem(ElemType a, ElemType b)
{
if(a == b)
return 1;// 若相等返回1
else
return 0;
}
void visit_print(void const *e)
{
printf("%d ",*(int *)e);
}
Status InitList_Sq(SqList *L)
{
//构造空线性表L
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE; //线性表L的初始容量
return OK;
}//InitList_Sq
Status DestroyList_Sq(SqList *L)
{
//销毁线性表L
free(L->elem);
L->elem=NULL;
L->length=0;
L->listsize=0;
return OK;
}//DestroyList_Sq()
Status ClearList_Sq(SqList *L)
{
//将L置为空表
L->length=0;
return OK;
}//ClearList_Sq()
Status ListEmpty_Sq(SqList L)
{
//判断是否为空表
if(L.length == 0) return TRUE;
else return ERROR;
}//ListEmpty_Sq()
Status ListLength_Sq(SqList L)
{
//返回线性表的长度
return L.length;
}//ListLength_Sq()
Status GetElem_Sq(SqList L, int i, ElemType *e)
{
//用e返回L中第i个元素的值
*e=*(L.elem+i-1);
return *e;
}//GetElem_Sq()
Status LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType , ElemType))
{
//在线性表中找到第1个与e满足compare()关系的元素的位序
ElemType *p;
int i=1;
p=L.elem;
while(i <= L.length && !(*compare)(*p++, e)) i++;
if(i < L.length)
return i; //返回位置
else
return 0;
}//LocateElem_Sq()
Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType * pre_e)
{
//若cur_e是L的元素,且不是第一个,则用pre_e返回它的前驱。否则操作失败,pre_e无定义
ElemType *p,i=1;
p=L.elem;
if(*(L.elem) == cur_e)
{
printf("%d is the first place has no PreElem", cur_e);
return INFEASIBLE;
}
else
{
while(*p != cur_e) p += i++;
if(i> 0 && i < L.length)
{
*pre_e=*(p-1);
return *pre_e;
}
else
{
return INFEASIBLE;
}
}
}//PriorElem_Sq()
Status NextElem_Sq(SqList L, ElemType cur_e, ElemType *next_e)
{
ElemType *p,i=1;
p=L.elem;
while( *p != cur_e) p+= i++;
if(p == L.elem+L.length-1)
{
printf("%d is the last letter has no next_elem\n", cur_e);
return INFEASIBLE;
}
else
return *next_e=*(p+1);
}//NextElem_Sq()
Status ListInsert_Sq(SqList *L, ElemType i, ElemType e) //i从1开始
{
//i的合法值为1<=i<=ListLength_Sq(L)+1
ElemType *newbase,*q,*p;
if(i <1 || i>L->length+1) //L->length初始为0
return ERROR;
if(L->length >= L->listsize)
{
newbase=(ElemType *) realloc(L->elem, (L->listsize+LISTINCREMENT) *sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L->elem = newbase; //新基址
L->listsize += LISTINCREMENT; //增加存储容量
}
q=L->elem+i-1; // q为插入位置
for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之后的元素右移 */
*(p+1)=*p;
*q=e; /* 插入e */
++(*L).length; /* 表长增1 */
return OK;
}//ListInsert_Sq()
Status ListDelete_Sq(SqList *L, ElemType i, ElemType *e)
{
//删除L中第i个数据元素,并用e返回其值,L的长度减1
ElemType *q,*p;
if(i <1 || i>L->length)
return ERROR;
p=L->elem+L->length-1;
q=L->elem+i-1; // q为删除位置
for(q; q < p; q++) /* 删除位置及之后的元素左移 */
*q=*(q+1);
--(*L).length; /* 表长减1 */
return OK;
}//ListDelete_Sq()
Status ListTraverse_Sq(SqList L, void (*visit)( void const *))
{
//操作结果:依次对L的每个数据元素调用visit()函数。一旦visit()失败,则操作失败
ElemType *ptr;
ptr=L.elem;
ElemType i=0;
for(i=0 ;i < L.length;i++)
visit(ptr+i);
printf("\n");
return OK;
}//ListTraverse_Sq()
void Union_Sq(SqList *La, SqList Lb)
{
ElemType la_ln,lb_ln,e;
la_ln=ListLength_Sq(*La);
lb_ln=ListLength_Sq(Lb);
ElemType i=1;
for( i; i <= lb_ln; i++)
{
GetElem_Sq(Lb, i, &e); //用e取得Lb中的数据
if( !LocateElem_Sq(*La, e, compare_Elem))
ListInsert_Sq(La, ++la_ln,e); // 若不存在这样的数,就在La的结尾添加这个数
}
}//Union_Sq()
void MergeList_Sq(SqList *La, SqList Lb,SqList *Lc)
{
//将La和Lb中的元素按递增关系合并到Lc中
ElemType *pa, *pb, *pc, *pa_last, *pb_last;
pa=La->elem;
pb=Lb.elem;
Lc->listsize = Lc->length=La->length+Lb.length;
pc=Lc->elem=(ElemType *)malloc(Lc->listsize*sizeof(ElemType));
if(!pc) exit(OVERFLOW);//存储分配失败
pa_last=La->elem+La->length-1;
pb_last=Lb.elem+Lb.length-1;
while((pa <= pa_last) && (pb <= pb_last)) //La和Lb均非空
{
if(*pa <= *pb)
*pc++ = *pa++;
else
*pc++ = *pb++;
}
while(pa <= pa_last) *pc ++ = *pa ++; //插入La剩余的元素
while(pb <= pb_last) *pc ++= *pb ++; //插入Lb剩余的元素
}//MergeList_Sq()
function.c中的LocateElem_Sq()及ListTraverse_Sq()函数的操作中涉及到函数指针的内容。不太熟悉的童鞋可以参见C语言基础知识----指针数组 && 数组指针 && 函数指针 &&指针函数
main.c
#include
#include
#include "declaration.h"
#include "function.h"
int main()
{
SqList La,Lb,Lc;
Status i,e;
int j;
i=InitList_Sq(&La);
if(i==1) /* 创建空表La成功 */
{
printf("La create success\n");
for(j=1;j<=5;j++) /* 在表La中插入5个元素 */
ListInsert_Sq(&La,j,j);
}
printf("La= "); /* 输出表La的内容 */
ListTraverse_Sq(La, visit_print);
InitList_Sq(&Lb); /* 也可不判断是否创建成功 */
for(j=1;j<=5;j++) /* 在表Lb中插入5个元素 */
ListInsert_Sq(&Lb,j,2*j);
printf("Lb= "); /* 输出表Lb的内容 */
ListTraverse_Sq(Lb,visit_print);
printf("Lb.length is %d\n",ListLength_Sq(Lb));
i= LocateElem_Sq(Lb, 2, compare_Elem);
printf("Lb中与2相等的数在第%d个位置\n",i);
printf("La表中第%d个位置的数是%d\n", 3, GetElem_Sq(La, 3, &e));
printf("La表中2前驱是%d\n", PriorElem_Sq(La, 2, &e));
printf("La表中2的后继是%d\n", NextElem_Sq(La, 2, &e));
printf("\n\n");
printf("MergeList function:");
MergeList_Sq(&La,Lb, &Lc);
printf("Lc= "); /* 输出新表La的内容 */
ListTraverse_Sq(Lc,visit_print);
printf("Union function:");
Union_Sq(&La,Lb);
printf("new La= "); /* 输出新表La的内容 */
ListTraverse_Sq(La,visit_print);
if(ListDelete_Sq(&La,3, &e) == OK)
{
printf("after delete La = ");
ListTraverse_Sq(La, visit_print);
}
return 0;
}运行结果
c语言函数实现顺序线性表,数据结构C语言实现——顺序线性表SqList相关推荐
- 哈希表-数据结构(C语言)
哈希表 什么是哈希表 我们在网站上注册账号时,当填好用户名后,系统都会判断用户名是否已被使用,如果已被使用,系统就会提示该用户名已被注册.那么系统是如何检测用户名是否被使用的呢?我们能想到的最简单的方 ...
- c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?
看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...
- 数据结构c语言版朱战立报告,数据结构(C语言版)
本书是Sedgewick彻底修订和重写的C算法系列的第一本.全书分为四部分,共16章.第一部分"基础知识"(第1-2章)介绍基本算法分析原理.第二部分"数据结构" ...
- 数据结构c语言程序题,严蔚敏《数据结构(c语言版)习题集》(包括基础部分).doc...
严蔚敏<数据结构(c语言版)习题集>(包括基础部分).doc 线性表第1章绪论11简述下列术语数据,数据元素.数据对象.数据结构.存储结构.数据类型和抽象数据类型.解数据是对客观事物的符号 ...
- c语言 数据结构面试题及答案,数据结构(C语言)【经典题库】含答案
数据结构(C语言)[经典题库]含答案 <数据结构与算法>复习题 选择题 1.在数据结构中,从逻辑上可以把数据结构分为 C . A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构 ...
- c语言第二版课后答案pdf,数据结构(C语言版)第2版习题答案—严蔚敏.pdf
数据结构( C语言版) (第2版) 课后习题答案 李冬梅 2015.3 目 录 第 1 章 绪论 1 第 2 章 线性表 5 第 3 章 栈和队列 14 第 4 章 串.数组和广义表 27 第 5 章 ...
- c语言作业题五六章答案,数据结构(C语言版)第五六章习题答案
数据结构(C语言版)第五六章习题答案,人民邮电出版社,答案很详细. (15)设F是一个森林,B是由F变换得的二叉树.若F中有n个非终端结点,则B中右指针域为空的结点有( )个. A. n-1 B.n ...
- c语言字符串递归例子,c语言函数递归(简单的递归例子c语言)
若在main函数中调用hanoi(3,'A','B','c')运行结果 void move(char getone,char . 分成三组: (一), 目的:将1号和2号从A移到B 调用函数:hano ...
- c语言函数与编译预处理教学视频,C语言课程第6章 函数及编译预处理.ppt
C语言课程第6章 函数及编译预处理 6.1模块化程序设计与函数 在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题. ...
- C语言中链表的英文名字,数据结构C语言版 循环链表表示和实现(国外英文).doc
数据结构C语言版 循环链表表示和实现(国外英文) 数据结构C语言版 循环链表表示和实现(国外英文资料) Data structure, C language, circular list repres ...
最新文章
- javascript---001-运行原理01_前端三大技术_JS重要性_Atwood定律_JS应用_JS让人迷惑_TypeScript会取代JS吗_JS是一门编程语言_浏览器工作原理_浏览器内核
- Kubernetes 与 Helm:使用同一个 Chart 部署多个应用
- 不小心把硬盘摔了一下,结果电脑变成这样了......
- 推荐好用的JavaScript模块
- woff字体MIME类型配置
- [uva11997]k个最小和
- java删除目录下符合条件的文件
- C++/CLR 使用(VS2012,VS2013,VS2015)编写
- 电路设计:为什么信号发生器设置的峰峰值,用示波器检测出是2倍?
- 【图像处理】高斯模糊、高斯函数、高斯核、高斯卷积操作
- edp和lvds区别在哪里 [转载]
- 网站检测-网站检测软件-免费网站安全检测工具
- 出现 CUDA out of memory 的解决方法
- 模拟斗地主发牌, 把54张牌发给三个玩家, 地主多三张, 对每个玩家的牌进行排序
- 6-8.4V自动升降压5V 9V 12V PD快充解决方案 TYPE-C快充
- RDF(Resource Description Framework)
- 电池的类型,你真的了解吗?
- SublimeLinter进行PHP代码检查
- 高斯消元法(二):高斯消元法原理
- 在MySQL中 NULL的含义是_mysql null的含义是什么