数据结构:顺序表(c语言)

由于C语言对与语句缩进要求不严格,所以说缩进不标准。

如有疑问可以在评论区留言,共同交流。

#define maxsize 100
#define OK 1
#define ERROR 0
typedef int elemtype;
#include<stdio.h>

//创建结构体
typedef struct
{
elemtype *elem;
int length; 
}sqlist;

//创建新线性表
int intlist(sqlist &L)
 {
 L.elem = new elemtype[maxsize];
 if (!L.elem)
 return ERROR;
 L.length=0;
 return OK;
 }

//插入元素
int listinsert(sqlist &L,int i,elemtype e)
 { 
 if((i<1)||(i>L.length+1)) 
 return ERROR;
 if(L.length==maxsize) 
 return ERROR;
 for(int j=L.length-1;j>=i-1;j--)
 L.elem[j+1]=L.elem[j];
 L.elem[i-1]=e;
 ++L.length;
 printf("插入结束\n");
 return OK;
 }

//la,lb,lc插入
int listinsert1(sqlist &L,int i,elemtype e)
 { 
 if((i<1)||(i>L.length+1)) 
 return ERROR;
 if(L.length==maxsize) 
 return ERROR;
 for(int j=L.length-1;j>=i-1;j--)
 L.elem[j+1]=L.elem[j];
 L.elem[i-1]=e;
 ++L.length;
 return OK;
 }

//取值
int getrlme(sqlist &L,int i,elemtype &e)
 { if(i<1||i>L.length) 
 return ERROR;
 e=L.elem[i-1];
 printf("取值成功\n");
 return OK;
 }

//查找
int locatelem(sqlist L,elemtype e)
 {
 for(int i=0;i<L.length;i++)
 if(L.elem[i]==e) return i+1;
 return 0;
 }

//删除
int listdelete(sqlist &L,int i,elemtype &e)
 { if(i<1||i>L.length) 
  {printf("删除错误");
 return ERROR;}
 e=L.elem[i-1];
 for(int j=i;j<=L.length-1;j++)
  L.elem[j-1]=L.elem[j];
 --L.length;
 return OK;
 }

//显示顺序表
int appear(sqlist L)
 { 
 for(int i=0;i<L.length;i++)
  {printf("%d",L.elem[i]);
  printf(" ");}
 printf("\n显示结束\n");
 return OK;
 }

//创建la,lb,合成lc
void MergeList(sqlist la, sqlist lb, sqlist &lc)
 { printf("la表内的值为:");
 appear(la);
 printf("lb表内的值为:");
 appear(lb);
 for(int ii=0;ii<la.length;ii++)
  {listinsert1(lc,ii+1,la.elem[ii]);}
 for(int i=0;i<lb.length;i++)
  {int why=locatelem(lc,lb.elem[i]);
 if(why==0)
  listinsert1(lc,lc.length+1,lb.elem[i]);}
 printf("lc表内的值为:");
 appear(lc);
 }

//lc内就地换位
void inverse(sqlist &lc)
 { printf("原来的lc为");
 appear(lc);
 int swidth=lc.length/2,h,l=lc.length;
 for(int zhou=0;zhou<swidth;zhou++)
  {h=lc.elem[zhou];
  lc.elem[zhou]=lc.elem[l-1];
  lc.elem[l-1]=h;
  l--;}
 printf("逆置后的lc为");
 }

int main()
{
int i,j,k,l,w,hhh=1;
int lawidth,lbwidth;
int laa[30],lbb[30];
elemtype e,f,g;
sqlist Q;
sqlist la,lb,lc;
intlist (Q);
intlist (la);
intlist (lb);
intlist (lc);
sqlist law;
intlist(law);

//快速创建一个顺序表
printf("请输入顺序表新建顺序表长度:");
scanf("%d",&law.length);
printf("请输入该顺序表的值:");
hhh=hhh+law.length;
for(i=0;i<law.length;i++)
 {
 scanf("%d",&law.elem[i]);
 }
for(int kk=0;kk<law.length;kk++)
 {
 listinsert1(Q,kk+1,law.elem[kk]);
 }
printf("\n");

printf("说明:0为退出\n1为插入元素\n2为取值\n3为查找\n4为删除\n5为显示顺序表\n6为建立la,lb并且合并为lc\n7为就地逆置lc\n");
do{ 
 printf("\n请输入你的操作数字\n");
 scanf("%d",&w);
 if (w==1)
  {printf("\n请输入你想插入的位置(1~%d)\n",hhh);
  scanf("%d",&i);
 while(i>hhh||i<1)
  {
  printf("超范围了,请重新输入操作数字\n");
  printf("\n请输入你想插入的位置(1~%d)\n",hhh);
  scanf("%d",&i);
  }
 ++hhh;
 printf("请输入你想插入元素的值\n");
 scanf("%d",&e);
 listinsert(Q,i,e);
 appear(Q);
 printf("\n");}
 else if(w==2)
  {printf("\n请输入你想取值的元素位置(1~%d)\n",(hhh-1));
  scanf("%d",&j);
  if(j>hhh-1) {printf("超范围了,请重新输入操作数字\n");continue;}
  getrlme(Q,j,f);
  printf("该元素为%d\n",f);
  printf("\n");}
 else if(w==3)
  {printf("\n请输入查找元素的值\n");
  scanf("%d",&k);
  int lc=locatelem(Q,k);
  if(lc)
  printf("元素的位置为%d\n",lc);
  else
  printf("该元素不存在");
  printf("\n");}
 else if(w==4)
  {printf("\n请输入要删除元素的位置(1~%d)\n",hhh-1);
  scanf("%d",&l);
  if(l>hhh-1) {printf("超范围了,请重新输入操作数字\n");continue;}
  listdelete(Q,l,g);
  printf("删除成功,删除的元素为%d\n",g);
  hhh--;
  printf("\n");}
 else if(w==5)
  {printf("\n显示顺序表\n");
  appear(Q);}
 else if(w==6)
  {printf("请输入la的数据长度(1~30):\n");
  scanf("%d",&lawidth);
  printf("请输入la内的数据:");
  for(int cun=0;cun<lawidth;cun++)
   {scanf("%d",&laa[cun]);}
  for(int ruler=0;ruler<lawidth;ruler++)
   {listinsert1(la,ruler+1,laa[ruler]);}
  printf("请输入lb的数据长度(1~30):\n");
  scanf("%d",&lawidth);
  printf("请输入lb内的数据:");
  for(int cun1=0;cun1<lawidth;cun1++)
   {scanf("%d",&lbb[cun1]);}
  for(int ruler1=0;ruler1<lawidth;ruler1++)
   {listinsert1(lb,ruler1+1,lbb[ruler1]);}
  MergeList(la,lb,lc);
  }
 else if(w==7)
  {inverse(lc);
  appear(lc);}
 else
  break;
 }while(w);
 printf("谢谢使用\n");
 }
posted @ 2019-10-26 12:15  lcyok  阅读(331)  评论(0)    收藏  举报