C语言实现顺序表的基本操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言实现顺序表的基本操作

2009-09-19 11:42:39| 分类: C语言实现数据结 |字号 订阅
头文件Sqlist1.h

#include
#include
#include

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 0

#define LIST_INIT_SIZE 10//线性表存储空间的初始分配量
#define LISTINCREMENT 2//线性表存储空间的分配增量

typedef int Status;
typedef int ElemType;
typedef struct Sqlist
{ ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量
}Sqlist;

//常用函数
void InitList(Sqlist &L);//初始化线性表
Status ListInsert(Sqlist &L,int i,ElemType e);//向线性表中插入元素
void ListTraverse(Sqlist L,void(*visit)(ElemType &));//遍历L中的元素,并输出
void print1(ElemType &e);//输出元素
Status ListEmpty(Sqlist L);//判断表是否为空表
void ClearList(Sqlist &L);//将表重置为空表
int ListLength(Sqlist L);//返回L中元素的个数
Status GetElem(Sqlist L,int i,ElemType &e);//用e返回L中第i个元素的值
int LocateElem(Sqlist L,ElemType e,Status(* compare)(ElemType,ElemType));//返回L中第1个与e满足关系compare()数据关系的位序,如果这样的数据不存在刚返回值为了0
Status equal(ElemType c1,ElemType c2);//判断是否相等的函数
Status PriorElem(Sqlist L,ElemType cur_e,ElemType &pre_e);//若cur_e是L的数据元素,而且不是第一个,就用pre_e返回它的前驱S
Status NextElem(Sqlist L,ElemType cur_e,ElemType &next_e);//若cur_e是L的数据元素,而且不是最后一个,就用next_e返回它的后继
Status ListDelete(Sqlist &L,int i,ElemType &e);//删除L的第i个元素,并用e返回其值,L的长度减1
void MergeList(Sqlist La,Sqlist Lb,Sqlist &Lc);//归并la和lb得到新的顺序表lc,lc的元素也是按值非递减排列的
void InferList(Sqlist La,Sqlist Lb,Sqlist &Lc);
void DifferList(Sqlist La,Sqlist Lb,Sqlist &Lc);//实现两个集合的差集

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

函数文件function1.cpp

#include"Sqlist1.h"
#include

void InitList(Sqlist &L)//构造一个空的顺序线性表L
{ L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) //存储分配失败
exit(OVERFLOW);
L.length=0;//空表长度为了0
L.listsize=LIST_INIT_SIZE;//初始存储量
}

Status ListInsert(Sqlist &L,int i,ElemType e)//在L的第i个位置上插入新的数据元素e,L的长度加1
{ ElemType *newbase,*p,*q;
if(i<1||i>L.length+1) return ERROR;//i不合法
if(L.length==L.listsize)//当前存储空间已满,增加分配
{ newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) //存储分配失败
exit(OVERFLOW);
L.elem=newbase;//新基

址给L.elem
L.listsize+=LISTINCREMENT;//增加存储容量
}
q=L.elem+i-1;//q为插入点
for(p=L.elem+L.length-1;p>=q;--p)//插入位置及以后元素后移
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}

void ListTraverse(Sqlist L,void(*visit)(ElemType&))//依次对L的每个数据元素调用函数visit(),它的形参加'&',表明可以通过visit()改变元素的值
{ ElemType *p=L.elem;//p指向第一个元素
int i;
for(i=1;i<=L.length;i++)
visit(*p++);
printf("\n");
}




Status ListEmpty(Sqlist L)
{ //如果L为空表,返回TRUE,否则返回FALSE
if(L.length==0) return TRUE;
else return FALSE;
}

void ClearList(Sqlist &L)//将L重置为空表
{ L.length=0;
}

int ListLength(Sqlist L)//返回L中元素的个数
{ return L.length;
}

Status GetElem(Sqlist L,int i,ElemType &e)//用e返回L中第i个元素的值
{ if(i<1||i>L.length)//如果i的值不在表L的范围内
return ERROR;
e=*(L.elem+i-1);//将第i个元素的值赋给e
return OK;
}

int LocateElem(Sqlist L,ElemType e,Status(*compare)(ElemType,ElemType))////返回L中第1个与e满足关系compare()数据关系的位序,如果这样的数据不存在刚返回值为了0
{ int i=1;
ElemType *p=L.elem;//p的初值为第1个元素的存储位置
while(i<=L.length&&!compare(*p++,e))//i没有超出表的范围,并且没有找到满足关系的数据元素
++i;
if(i<=L.length)//找到满足关系的数据元素
return i;
else
return 0;
}



Status PriorElem(Sqlist L,ElemType cur_e,ElemType &pre_e)
{//若cur_e是L的数据元素,而且不是第一个,就用pre_e返回它的前驱S
int i=2;//从第2个元素开始
ElemType *p=L.elem+1;//p指向第2个元素
while(i<=L.length&&*p!=cur_e)//i没有超出范围而且没有找到值为cur_e的元素
{ p++;
i++;
}
if(i>L.length)//到表结束还没有找到值为cur_e的元素
return ERROR;
else//找到值为cur_e,并由p指向
{ pre_e=*--p;//p指向前一个元素的前驱,并将所指元素的值赋给pre_e
return OK;
}
}

Status NextElem(Sqlist L,ElemType cur_e,ElemType &next_e)//若cur_e是L的数据元素,而且不是最后一个,就用next_e返回它的后继
{ int i=1;//从第1个元素开始
ElemType *p=L.elem;
while(i{ p++;
i++;
}
if(i==L.length)//到表尾还没有找到cur_e
return ERROR;
else
{ next_e=*++p;//p指向下一个元素,将所指元素的值赋给next_e
return OK;
}
}

Status ListDelete(Sqlist &L,int i,ElemType &e)
{ ElemType *p,*q;
if(i<1||i>L.length) return ERROR;
p=L.elem+i-1;//p为被删除的元素的位置
e=*p;
q=L.elem+L.length-1;//q为表尾的位置
for(++p;p<=q;++p)//被删除之后的元素前移
*(p-1)=*p;
L.length--;
return OK;
}
Status equal(ElemType c1,ElemType c2)//判断是否相等
{ if(c1==c2)
return TRUE;
else return FALSE;
}
void prin

t1(ElemType &c)
{ printf("%d",c);
}

Status Jequal(Sqlist L,ElemType e)
{ int i;
for(i=0;i{ if(L.elem[i]==e) return OK;
else return ERROR;
}
}

void MergeList(Sqlist La,Sqlist Lb,Sqlist &Lc)
{//归并La和Lb得到新的顺序表Lc,它的元素也按值非递减排列
ElemType *pa,*pa_last,*pb,*pb_last,*pc;
pa=La.elem;//pa指向表LA的第1个元素
pb=Lb.elem;//pb指向表LB的第2个元素
Lc.listsize=Lc.length=La.length+Lb.length;
pc=Lc.elem=(ElemType *)malloc(Lc.listsize*sizeof(ElemType));//分配所需空间
if(!Lc.elem)//存储分配失败
exit(OVERFLOW);
pa_last=La.elem+La.length-1;//pa_last指向最后一个元素
pb_last=Lb.elem+Lb.length-1;//pb_last指向最后一个元素

while(pa<=pa_last&&pb<=pb_last)//表LA和表LB中均有元素没有归并
{
if(*pa<=*pb)
*pc++=*pa++;//将pa所指单元的值赋给pc所指单元后,pa,pc分别加1
else
*pc++=*pb++;
}//以下两个循环只有一个被执行
while(pa<=pa_last)//表la中还有元素未归并
*pc++=*pb++;
while(pb<=pb_last)//表lb中还有元素未归并
*pc++=*pb++;
}

/*void DifferList(Sqlist La,Sqlist Lb,Sqlist &Lc)//实现两个集合的差集
{

ElemType e;

int i,j;
InitList(Lc);
Lc.length=0;



for(i=0;i{
GetElem(La,i,e);
if(!Jequal(Lb,e))
ListInsert(Lc,++Lc.length,e);



}
}*/



void InferList(Sqlist La,Sqlist Lb,Sqlist &Lc)//实现两个集合的交集
{ ElemType *pa,*pb,*pc;
pa=La.elem;//pa指向第一个元素
pb=Lb.elem;//pb指向第二个元素
int i,j;
pc=Lc.elem=(ElemType *)malloc(Lc.listsize*sizeof(ElemType));//pc分配空间
Lc.length=0;

for(i=0;i{
for(j=0;j{
if(La.elem[i]==Lb.elem[j])
{ Lc.elem[Lc.length]=La.elem[i];
Lc.length++;
}
}
}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

主函数文件operate1.cpp

#include"Sqlist1.h"
#include"stdio.h"


main()
{ Sqlist L;
int i,k,len,eql;
ElemType e,pre,next,del;
Sqlist La,Lb,Lc;

InitList(L);//初始化
for(i=1;i<=5;i++)
k=ListInsert(L,1,i);//向顺序表中插入元素
ListTraverse(L,print1);//输出表中的元素

k=ListEmpty(L);//判断表是否为空
printf("判断L是否为空(k=1,是;k=0,否)?:k=%d",k);

printf("\n");
len=ListLength(L);//返回顺序表的长度
printf("线性表的长度为:%d",len);

printf("\n");
for(i=1;i<=5;i++)
{GetElem(L,i,e);//返回第i个元素的值
printf("第%d个元素的值为%d\n",i,e);
}

printf("\n");
eql=LocateElem(L,2,equal);//判断有没有和"2"相等的元素
printf("第%d个元素满足\n",eql);

printf("前驱查找:\n");
for(i=1;i<5;i++)
{PriorElem(L,i,pre);//返回元素的前驱

printf("元素%d:的前驱为%d\n",i,pre);
}

printf("后继查找:\n");
for(i=2;i<=5;i++)
{
NextElem(L,i,next);
printf("元素%d:的后继为%d\n",i,next);
}

printf("\n");
ListDelete(L,2,del);
printf("删除元素为%d\n",del);
len=ListLength(L);
printf("此时线性表的长度为%d",len);



printf("\n");
ClearList(L);
k=ListEmpty(L);
printf("再次判断L是否为空(k=1,是;k=0,否)?:k=%d",k);

printf("\n\n两个线性表的合并\n");
InitList(La);
for(i=1;i<=5;i++)
ListInsert(La,i,i);
printf("La=");
ListTraverse(La,print1);
printf("\n");

InitList(Lb);
for(i=1;i<=5;i++)
ListInsert(Lb,i,2*i);
printf("Lb=");
ListTraverse(Lb,print1);
printf("\n");


MergeList(La,Lb,Lc);
printf("两个集合的并集Lc=");
ListTraverse(Lc,print1);

InferList(La,Lb,Lc);
printf("两个集合的交集Lc=");
ListTraverse(Lc,print1);

/*DifferList(La,Lb,Lc);
printf("两个集合的差集Lc=");
ListTraverse(Lc,print1);*/

}

相关文档
最新文档