数据结构-线性表输入,输出,插入,删除,查找(借鉴实操)

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

创建一个线性表实现输入,输出,插入,删除,定位。

(注意:不论在调用哪个函数前,都要先使L.elem=a,就是使指针elem回到数组a的首地址。)

#include

#include

#include

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量

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

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int ElemType; //接下来ElemType代表的就是int

typedef int Status; //Status也代表int

int i,*p,*q; //p,q都是指针类型

ElemType e;

typedef struct

{

ElemType *elem; //定义成指针类型//存储空间基址

int length; //当前长度

int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位) }SqList;

//***********************构建空的线性表*************************// Status InitList_Sq(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; //初始存储容量

return OK;

}

//**************************线性表输入函数*********************//

void input(SqList &L) //输入函数

{

scanf("%d",L.elem); //要先输入一个,不然一开始就是0,无法进行循环while(*L.elem) // 加*是因为elem是指针,加之后才代表值{

L.elem++; //输入后指针后移

L.length++; //表长加1

scanf("%d",L.elem); //循环中也要再输入

}

}

//**************************线性表打印函数********************//

void print(SqList &L) //输出函数

{

int n;

for(n=0;n

{

printf("%d\t",*L.elem);

L.elem++; //输出后指针后移

}

}

//***********线性表插入函数(在第i个位置插入一个数据e)*************// Status ListInsert_Sq(SqList &L,int i,ElemType e)//插入函数

{

//在顺序线性表L中第i个位置之前插入新的元素e

//i的合法值为1<=i<=ListLength.Sq(L)+1

Status *newbase;指针类型。因为elem是指针类型

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.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;

}

//*********线性表删除函数(删除第i个位置,并用e返回删除的数据)********// Status ListDelete_Sq(SqList &L,int i,ElemType &e)//删除函数引用调用

{

//在顺序线性表L中删除第i个元素,并用e返回其值

//i的合法值为1<=i<=ListLength.Sq(L)

if((i<1)||(i>L.length))

return ERROR; //i值不合法p=&(L.elem[i-1]); //p为被删除元素的位置e=*p; //被删除元素的值赋给e q=L.elem+L.length-1; //表尾元素的位置

for(++p;p<=q;++p)

*(p-1)=*p; //在被删除元素位置后面的元素左移--L.length; //表长减1

return OK;

}

//****线性表查找(定位)函数(找到第1个与e相等的值,返回其位置i)********// int LocateElem_Sq(SqList L,ElemType e,

Status(*compare)(ElemType,ElemType))//定位函数

{

//在顺序线性表L中查找第1个值与e满足compare()的元素的位序

//若找到,则返回其在L中的位序,否则返回0

i=1; //i的初值为第1个元素的位序p=L.elem; //p的初值为第1个元素的存储位置while(i<=L.length&&!(*compare)(*p++,e)) ++i; //将表L中的元素依次与e进行比较

if(i<=L.length) return i;

else return 0;

}

//**************************比较函数*******************************// Status Compare(ElemType m,ElemType e) //比较的是实数,不用定义成指针{

if(m==e)

return OK;

else

return ERROR;

}

//*********************主函数**********************//

void main()

{

SqList L;

int a[100];

if(InitList_Sq(L))

{

L.elem=a; //将数组的首地址赋给指针elem

printf("请输入数据:\n");

input(L); //输入线性表L }

L.elem=a; //指针elem回到数组首地址,//因为在用的过程中指针已经移动,所以必须归位,才能再从第一个用起。

printf("您输入的数据为:\n");

print(L); //输出线性表L

printf("\n");

printf("请输入插入元素的位置:");

scanf("%d",&i);

相关文档
最新文档