数据结构实验1:线性表
第一次写博客,也没啥好说的,直接上代码吧。
我的代码参考过其他人的,不过已经找不到了,如果有问题,欢迎联系。
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define List_INIT_SIZE 100
#define listINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//int i,*p,*q;
typedef int ElemType;
//typedef int Status;
//ElemType e;
typedef struct{
ElemType *elem; //储存空间基址,指针类型
int length;
int listsize;
}SqList;//定义Sq这个新的数据类型
Status InitList_Sq(SqList &L)//构建空的线性表 L
{
L.elem=(ElemType *)malloc(List_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);//储存分配失败
L.length=0;//空表长度为1
L.listsize=List_INIT_SIZE;//初始储存容量
return OK;
}
void input(SqList &L)//输入函数
{
scanf("%d",L.elem);//先输入一个数据,不然无法进行循环
while(*L.elem){
L.elem++;//输入后指针后移
L.length++;//表长加一
scanf("%d",L.elem);//循环中再次输入数据
}
}
void print(SqList &L)//输出函数
{
int n;
for(n=0;n<L.length;n++){
printf("%d ",*L.elem);
L.elem++;//输出后指针后移
}
}
Status ListInsert_Sq(SqList &L,int i,ElemType e)//插入函数,
{
//在第 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;//表长加一
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType &e)//删除函数
{
//删除第 i个元素,并用 e返回
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; // 表长减一
return OK;
}
Status Compare(ElemType m,ElemType e)//比较函数
{
if(m==e) return OK;
else return ERROR;
}
int LocateElem_Sq(SqList L,ElemType e,Status(*Compare)(ElemType,ElemType))//查找函数
{
//查找第一个与 e相等的元素,找到则返回其位序,否则返回 0
i=1;
p=L.elem;
while(i<=L.length&&!(*Compare)(*p++,e)) i++;
if(i<=L.length) return i;
else return 0;
}
main(){
SqList L;
int x,y,z,j,k,e,u,v,r,m,l=1;
int a[100];
if(InitList_Sq(L)){
L.elem=a;//将数组的首地址给 elem
printf("请输入数据:\n");
input(L);//输入线性表 L
}//
L.elem=a;//指针elem 回到数组首地址
printf("你输入的数据为:\n");
print(L);
printf("\n");
do{
printf("是否进行插入操作,如果进行输入1,否则输入0,并以回车键结束\n");
scanf("%d",&x);
if(x==1){
printf("请输入要插入的位置:");
scanf("%d",&y);
printf("请输入要插入的元素:");
scanf("%d",&z);
L.elem=a;//指针elem 回到数组首地址
if(ListInsert_Sq(L,y,z)){
printf("插入元素后的线性表:\n");
print(L);
}//
}//
L.elem=a;//指针elem 回到数组首地址
printf("\n是否进行删除操作,如果进行输入1,否则输入0,并以回车键结束\n");
scanf("%d",&j);
if(j==1){
printf("请输入要删除的位置:");
scanf("%d",&k);
if(ListDelete_Sq(L,k,e) ){
printf("删除的元素是:%d",e);
printf("删除元素后的线性表:\n");
print(L);
}//
} //
L.elem=a;//指针elem 回到数组首地址
printf("\n是否进行查找操作,如果进行输入1,否则输入0,并以回车键结束\n");
scanf("%d",&u);
if(u==1){
printf("请输入要查找的元素:");
scanf("%d",&v);
r=LocateElem_Sq(L,v,Compare);
if(r)
printf("元素%d在线性表中的位置为:%d\n",v,r);
else printf("你输入的元素在此线性表中冒有找到;\n");
}
printf("\n是否还想继续进行这些操作,如果想输入1,不想输入0\n");
scanf("%d",&m);
l=m;
}while(l);
}//mian