数据结构---顺序表c实现

#include <stdio.h>
#include <stdlib.h>
typedef int elemType;
struct List{
 elemType *list;
 int size;
 int maxsize;
};
void againMalloc(struct List *L);/*0.扩展函数*/
void initList(struct List *L, int ms);/*1.初始化线性表函数*/
void clearList(struct List *L);/*2.清除线性表函数*/
int sizeList(struct List *L);/*3.返回线性表长度函数*/
int emptyList(struct List *L);/*4.判定线性表是否为空函数*/
elemType getElem(struct List *L, int pos);/*5.返回线性表L中第pos个元素的值,若pos超出范围,则停止程序运行*/
void traverseList(struct List *L);/*6.遍历输出线性表L中每个元素*/
int findList(struct List *L, elemType x);/*7.查找线性表L中与x相等元素并返回其位置,否则返回-1*/
int updatePosList(struct List *L, int pos, elemType x);/*8.把线性表L中第pos个元素的值修改为x的值,若修改成功返回1,否则返回0*/
void inserFirstList(struct List *L, elemType x);/*9.向线性表L的表头插入元素x*/
void insertLastList(struct List *L, elemType x);/* 10.向线性表L的表尾插入元素x*/
int insertPosList(struct List *L, int pos, elemType x);/*11.向线性表L中第pos个元素位置插入元素x,若插入成功返回1,否则返回0*/
void insertOrderList(struct List *L,int pos, elemType x);/*12.向有序线性表L中插入元素x, 使得插入后仍然有序*/
elemType deleteFirstList(struct List *L);/*13.从线性表L中删除表头元素并返回它,若删除失败则停止程序运行*/
elemType deleteLastList(struct List *L);/*14.从线性表L中删除表尾元素并返回它,若删除失败则停止程序运行*/
elemType deletePosList(struct List *L, int pos);/*15.从线性表L中删除第pos个元素并返回它,若删除失败则停止程序运行*/
int deleteValueList(struct List *L, elemType x);/*16.从线性表L中删除值为x的第一个元素,若成功返回1,失败返回0*/
void sortAlgorithm(struct List *L);/*17.排序算法*/
void againMalloc(struct List *L){/*0.扩展函数*/
 elemType *p = realloc(L->list,2 * L->maxsize * sizeof(elemType));
 if(!p){
  printf("扩展空间分配失败!\n");
  exit(1);
 }
 L->list = p;
 L->maxsize = 2 * L->maxsize;
 return ;
}
void initList(struct List *L, int ms){/*1.初始化线性表函数*/
 int x=0,k=0,size;
 while(ms <= 0|| ms >32767 || (ms/ms)!=1 ){
  printf("线性表长度输入有误\n请输入正整数:");
  scanf("%d",&ms);
 }
 L->list = malloc(ms *sizeof(elemType));
 if(!L->list){
  printf("开拓空间分配失败!\n");
  exit(1);
 }
 L->maxsize = ms;
 printf("请输入小于%d的数据长度以便录入:",L->maxsize);
 scanf("%d",&size);
 while(size>L->maxsize||size<0){
  printf("输入数据长度有误,请重新输入1--%d的数据长度",L->maxsize);
 }
 L->size=size;
 printf("请输入%d个数据,空格间隔:",L->size);
 while(k != (L->size)){ 
  scanf("%d",&x);
  if(x>=(-32768)||x<=32767){
  }
  else{
   printf("输入x有误,请重新输入:");
   scanf("%d",&x);
   k--;
   continue;
  }
  L->list[k]=x;
  k++;
 }
 printf("线性表L输入完毕!");
 return ;
}
void clearList(struct List *L){/*2.清除线性表函数*/
 if(L->list != NULL){
     free(L->list);
  L->list = 0;
  L->size = 0;
  L->maxsize = 0;
 }
 else{
  exit(1);
    }
 return ;
}
int sizeList(struct List *L){/*3.返回线性表长度函数*/
 return L->size;
}
int emptyList(struct List *L){/*4.判定线性表是否为空函数*/
 if(L->size ==0){
  return 1;
 }
 else{
  return 0;
 }
}
elemType getElem(struct List *L, int pos){/*5.返回线性表L中第pos个元素的值,若pos超出范围,则停止程序运行*/
 while(pos>L->size||pos<1){
  printf("查询pos位置越界\n请重新输入>1%d<=的正整数",L->size);
  scanf("%d",&pos);
  return getElem(L, pos);
 }
 return L->list[pos-1];
}
void traverseList(struct List *L){/*6.遍历输出线性表L中每个元素*/
 int i;
 for(i=0;i<L->size;i++){
  printf("%d ",L->list[i]);
 }
 return ;
}
int findList(struct List *L, elemType x){/*7.查找线性表L中与x相等元素并返回其位置,否则返回提示语句*/
    int i=0,j=0,l;
 for(i=0;i<L->size;i++){
  if(L->list[i] == x){
  j++;
  l=i+1;
  }
 }
 if(j==0){
    printf("该线性表没有与x相等的数据");
 }
 return l;
}
int updatePosList(struct List *L, int pos, elemType x){/*8.把线性表L中第pos个元素的值修改为x的值,若修改成功返回1,否则返回0*/
 while(pos<1||pos>L->size){
  printf("修改位置越界请重新输入[1,%d]之间的正整数:",L->size);
  scanf("%d",pos);
  while(x<(-32768)||x>32767){
  printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
  scanf("%d",x);
  }
  updatePosList(L,pos,x);
 }
 while(L->list==NULL){
  int hs=0;
  printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
  printf("请输入新线性表的长度:");
  scanf("%d",hs);
  initList(L,hs);
  updatePosList(L,pos,x);
 }
  L->list[pos-1]=x;
  if(L->list[pos-1]==x){
  printf("修改成功返回1");
     return 1;
  }
  else{
  printf("修改不成功返回0");
  return 0;
 }
}
void inserFirstList(struct List *L, elemType x){/*9.向线性表L的表头插入元素x*/
 int i=1,j=0;
 while(L->list==NULL){
  int hs=0;
  printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
  printf("请输入新线性表的长度:");
  scanf("%d",&hs);
  initList(L,hs);
  while(x<(-32768)||x>32767){
      printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
     scanf("%d",x);
  }
  inserFirstList(L,x);
 }
 if(L->size+1>L->maxsize){
  struct List *h=0 ;
  printf("原线性表已满,执行重新构造线性表");
  h->list = malloc((L->maxsize+1) * sizeof(elemType));
  if(!h->list){
  printf("扩展空间分配失败!\n");
  exit(1);
  }
  h->list[0]=x;
  for(i = 1,j = 0;i <L->maxsize,j <(L->maxsize-1);i++,j++){
   h->list[i]=L->list[j];
        }
        h->maxsize = L->maxsize+1;
  h->size = L->maxsize+1;
        clearList(L);
  L->list = h->list;
  clearList(h);
 }
 else{
  printf("原线性表未满,表头插入成功!");
  for(i=1,j=0;i<L->size,j<(L->size-1);i++,j++){
    L->list[L->size-j]=L->list[L->size-i];
        }
  L->list[0]=x;
  L->size=L->size+1;
 }
}
void insertLastList(struct List *L, elemType x){/* 10.向线性表L的表尾插入元素x*/
 int i=0,j=0;
 while(L->list==NULL){
  int hs=0;
  printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
  printf("请输入新线性表的长度:");
  scanf("%d",&hs);
  initList(L,hs);
  while(x<(-32768)||x>32767){
      printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
     scanf("%d",x);
  }
  insertLastList(L,x);
 }
     if(L->size+1>L->maxsize){
  struct List *h =0;
  printf("原线性表已满,执行重新构造线性表");
  h->list = malloc((L->maxsize+1) * sizeof(elemType));
  if(!h->list){
  printf("扩展空间分配失败!\n");
  exit(1);
  }
  h->list[L->maxsize]=x;
  for(i = 0,j = 0;i <L->maxsize,j <L->maxsize;i++,j++){
   h->list[i]=L->list[j];
        }
        h->maxsize = L->maxsize+1;
  h->size = L->maxsize+1;
        clearList(L);
  L->list = h->list;
  clearList(h);
 }
 else{
  printf("原线性表未满,执行表尾插入成功!");
  L->list[L->size]=x;
  L->size=L->size+1;
 }
}
int insertPosList(struct List *L, int pos, elemType x){/*11.向线性表L中第pos个元素位置插入元素x,若插入成功返回1,否则返回0*/
 int i=1,j=0;
     while(L->list==NULL){
  int hs=0;
  printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
  printf("请输入新线性表的长度:");
  scanf("%d",&hs);
  initList(L,hs);
  while(x<(-32768)||x>32767){
      printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
     scanf("%d",&x);
  }
  while(pos<=1||pos>=L->size){
  printf("输入插入位置错误,请重新输入>1且<%d的正整数",L->size);
  scanf("%d",&pos);
  }
        insertPosList(L,pos,x);

  }
  
  if(L->size+1>L->maxsize){
  struct List *h =0;
  printf("原线性表已满,执行重新构造线性表");
  h->list = malloc((L->maxsize+1) * sizeof(elemType));
  if(!h->list){
  printf("扩展空间分配失败!\n");
  exit(1);
  }
  for(i = 1,j = 0;i <L->maxsize,(j <L->maxsize+1);i++,j++){
   if((L->size-i)== (pos - i)){
            h->list[L->size-i]=x;
   }
   else{
   h->list[L->size-j]=L->list[L->size-i];
            }
  }
        h->maxsize = L->maxsize+1;
  h->size = L->maxsize+1;
        clearList(L);
  L->list = h->list;
  clearList(h);
 }
 else{
  printf("原线性表未满,可以执行表中插入");
  for(i = L->size - 1; i >= pos - 1; i--){
   L->list[i + 1] = L->list[i];
  }
  L->list[pos - 1] = x;
  L->size=L->size+1;
  return 1;
  
 }
 return 0;
}
void insertOrderList(struct List *L, int pos,elemType x){/*12.向有序线性表L中插入元素x, 使得插入后仍然有序*/
  while(L->list==NULL){
  int hs=0;
  printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
  printf("请输入新线性表的长度:");
  scanf("%d",&hs);
  initList(L,hs);
  while(x<(-32768)||x>32767){
      printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
     scanf("%d",&x);
  }
  while(pos<1||pos>L->size){
  printf("输入插入位置错误,请重新输入>=1且<=%d的正整数",L->size);
  }
    }
        if(pos==1){
   inserFirstList(L,x);
   sortAlgorithm(L);
   traverseList(L);
  }
  else if(pos==L->size){
   insertLastList(L,x);
   sortAlgorithm(L);
   traverseList(L);
  }
  else{
   insertPosList(L,pos,x);
   sortAlgorithm(L);
   traverseList(L);
  }
 
  return ;
}
void sortAlgorithm(struct List *L){
 int j=0,k=1,i=0,l=1;
  printf("请选择1->升序或者2->降序:");
  scanf("%d",&i);
  while(!(i==1||i==2)){
   printf("选择错误,请重新选择:");
   scanf("%d",&i);
        }
  switch(i)
  {
  case 1:
   for(j=0;j<L->size;j++){
    while(k<L->size){
     if(L->list[j]>L->list[k])
     {
      i=L->list[j];
      L->list[j]=L->list[k];
      L->list[k]=i;
     }
     k++;
    }
    k=l++;
   }
   break;
       default:
      for(j=0;j<L->size;j++){
    while(k<L->size){
     if(L->list[j]<L->list[k])
     {
      i=L->list[j];
      L->list[j]=L->list[k];
      L->list[k]=i;
     }
     k++;
    }
    k=l++;
   }
   break;
  }
  return ;
}

elemType deleteFirstList(struct List *L){/*13.从线性表L中删除表头元素并返回它,若删除失败则停止程序运行*/
 int i=0;
 elemType k=0;
 k=L->list[i];
 for(i=0;i<L->size;i++){
  L->list[i]=L->list[i+1];
 }
 L->list[i]=0;
 L->size=L->size-1;
 L->maxsize=L->maxsize-1;
 return k;
}
elemType deleteLastList(struct List *L){/*14.从线性表L中删除表尾元素并返回它,若删除失败则停止程序运行*/
 elemType k=0;
 k=L->list[L->size-1];
 L->list[L->size-1]=0;
 L->size=L->size-1;
 L->maxsize=L->maxsize-1;
 return k;
}
elemType deletePosList(struct List *L, int pos){/*15.从线性表L中删除第pos个元素并返回它,若删除失败则停止程序运行*/
  int i=0;
     elemType k=0;
     while(L->list==NULL){
  int hs=0;
  printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
  printf("请输入新线性表的长度:");
  scanf("%d",&hs);
  initList(L,hs);
  while(pos<=1||pos>=L->size){
  printf("输入插入位置错误,请重新输入>1且<%d的正整数",L->size);
  scanf("%d",&pos);
  }
        deletePosList(L,pos);
  }
  k=L->list[pos-1];
  if(pos-i<L->size){
  L->list[pos-1-i]=L->list[pos-i];
  }
  L->list[L->size-1]=0;
  L->size=L->size-1;
  L->maxsize=L->maxsize-1;
        return k;
}
int deleteValueList(struct List *L, elemType x){/*16.从线性表L中删除值为x的第一个元素,若成功返回1,失败返回0*/
  while(L->list==NULL){
  int hs=0;
  printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
  printf("请输入新线性表的长度:");
  scanf("%d",&hs);
  initList(L,hs);
  while(x<(-32768)||x>32767){
      printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
     scanf("%d",x);
  }
  deleteValueList(L,x);
  }
     if(findList(L,x)==1){
   deleteFirstList(L);
  }
  else if(findList(L,x)==L->size){
   deleteLastList(L);
  }
  else{
   deletePosList(L,findList(L,x));
  }
  return 1;
}
   
void main()
{
 int i,ms,pos;
 elemType x;
 struct List L;
 while(1){
 printf("0->扩展线性表为2倍\n1->初始化线性表\n2->清除线性表\n3->返回线性表长度\n4->判定线性表是否为空\n5->返回线性表L中第pos个元素的值\n");
    printf("6->遍历输出线性表L中每个元素\n7->查找线性表L中与x相等元素并返回其位置\n8->把线性表L中第pos个元素的值修改为x的值\n");
 printf("9->向线性表L的表头插入元素x\n10->向线性表L的表尾插入元素x\n11->向线性表L中第pos个元素位置插入元素x\n");
 printf("12->向有序线性表L中插入元素x使得插入后仍然有序\n13->从线性表L中删除表头元素并返回它\n14->从线性表L中删除表尾元素并返回它\n");
 printf("15->从线性表L中删除第pos个元素并返回它\n16->从线性表L中删除值为x的第一个元素\n17->排序算法\n");
 printf("请选择操作:");
 scanf("%d",&i);
  while(i<0||i>17){
   printf("输入操作不存在,重新输入");
   scanf("%d",&i);
   continue;
  }
      switch(i){
    case 0:
     printf("\n");
     printf("0->扩展线性表为2倍");
     againMalloc(&L);
     break;
       case 1:
     printf("\n");
     printf("1->初始化线性表");
     printf("请输入构造线性表长度:");
     scanf("%d",&ms);
     initList(&L,ms);
     break;
       case 2:
     printf("\n");
     printf("2->清除线性表");
     clearList(&L);
     break;
       case 3:
     printf("\n");
     printf("3->返回线性表长度");
     printf("线性表长度为%d",sizeList(&L));
     getchar();
     getchar();
              break;
       case 4:
              printf("\n");
     printf("4->判定线性表是否为空:");
              if(!emptyList(&L)){
      printf("线性表非空!");
     }
     else{
      printf("线性表为空!");
     }
     getchar();
     getchar();
     break;
       case 5:
     printf("\n");
     printf("5->返回线性表L中第pos个元素的值\n");
     printf("请输入查询L线性表pos位置:");
     scanf("%d",&pos);
     printf("\n");
     printf("线性表第%d个值为%d",pos,getElem(&L,pos));
     getchar();
     getchar();
     break;
       case 6:
     printf("\n");
     printf("6->遍历输出线性表L中每个元素");
     traverseList(&L);
     getchar();
     getchar();
     break;
    case 7:
     printf("\n");
     printf("7->查找线性表L中与x相等元素并返回其位置\n");
     printf("请输入查询x的值:");
     scanf("%d",&x);
     printf("\n");
     printf("与x相等的表中位置为:%d",findList(&L,x));
     getchar();
     getchar(); 
     break;
    case 8:
     printf("\n");
     printf("8->把线性表L中第pos个元素的值修改为x的值\n");
     printf("请输入把线性表L位于pos值改为x:\n");
     printf("请输入pos:");
     scanf("%d",&pos);
     printf("\n");
     printf("请输入x:");
     scanf("%d",&x);
     updatePosList(&L,pos,x);
     break;
    case 9:
     printf("\n");
     printf("9->向线性表L的表头插入元素x\n");
     printf("请输入在表头插入的x值\n");
     scanf("%d",&x);
     inserFirstList(&L,x);
     getchar();
     getchar();
     break;
    case 10:
     printf("\n");
     printf("10->向线性表L的表尾插入元素x\n");
     printf("请输入在表尾插入的x值:");
     scanf("%d",&x);
     insertLastList(&L,x);
     getchar();
     getchar();
     break;
    case 11:
     printf("\n");
     printf("11->向线性表L中第pos个元素位置插入元素x\n");
     printf("请输入在表L中pos位置插入的x值\n");
     printf("请输入pos:");
     scanf("%d",&pos);
     printf("\n");
     printf("请输入x:");
     scanf("%d",&x);
     insertPosList(&L,pos,x);
     getchar();
     getchar();
     break;
    case 12:
     printf("\n");
     printf("12->向有序线性表L中插入元素x\n");
     printf("请输入在表L中pos位置插入的x值\n");
     printf("请输入pos:");
     scanf("%d",&pos);
     printf("\n");
     printf("请输入x:");
     scanf("%d",&x);
     insertOrderList(&L,pos,x);
     getchar();
     getchar();
     break;
    case 13:
     printf("\n");
     printf("13->从线性表L中删除表头元素并返回它\n");
     printf("被删除的表头元素为:%d",deleteFirstList(&L));
     getchar();
     getchar();
              break;
    case 14:
     printf("\n");
     printf("14->从线性表L中删除表尾元素并返回它");
              printf("被删除的表尾元素为:%d",deleteLastList(&L));
     getchar();
     getchar();
     break;
    case 15:
     printf("\n");
     printf("15->从线性表L中删除第pos个元素并返回它\n");
     printf("请输入在表L中删除的pos位置:");
     printf("请输入pos:");
     scanf("%d",&pos);
     deletePosList(&L,pos);
     printf("\n");
     printf("被删除的表中第%d个元素为:%d",pos,deletePosList(&L,pos));
     getchar();
     getchar();
     break;
    case 16:
     printf("\n");
     printf("16->从线性表L中删除值为x的第一个元素\n");
     printf("请输入在表L中删除的x值:");
     printf("请输入x:");
     scanf("%d",&x);
     deleteValueList(&L,x);
     getchar();
     getchar();
              break;
    case 17:
     printf("\n");
     printf("17->排序算法\n");
     sortAlgorithm(&L);
     printf("排序后遍历:");
              traverseList(&L);
     getchar();
     getchar();
     break;
   }
   system("cls"); 
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值