C语言——线性表 (数据结构)

  • 对线性表操作的主体功能实现

数据结构

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
      //函数返回状态代码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBL E -1
#define OVERFLOW -2
      //运用动态分配的顺序存储结构
#define LIST_INIT_SIZE 100 
#define LISTINCREMENT 10 

typedef int ElemType;
typedef int Status;

typedef struct{
    
    
      ElemType *elem;
      int length;
      int listsize;}SqList;
      


Status InitList(SqList &L){
    
    
      //初始化一个顺序表;
      L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
      if(!L.elem) exit(OVERFLOW);
      L.length=0;
      L.listsize=LIST_INIT_SIZE;
      return OK;
      }//InitSqList
      
Status ListInsert(SqList &L,int i,ElemType e){
    
    
      //在第i个元素前插入一个新的元素
      if(i<1||i> ++L.length){
    
    
      	return ERROR;
	  } 
      if(L.length==L.listsize){
    
    
      ElemType*newbase=(ElemType*)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
      if(!newbase) {
    
    
      	exit(OVERFLOW);
	  }
      L.elem=newbase;
      L.listsize=LIST_INIT_SIZE+LISTINCREMENT;}
     for (int j=L.length;j>=i;--j)
      L.elem[j]=L.elem[j-1];
      L.elem[i-1]=e;
      return OK;
      }//ListInsert
      
Status GetElem(SqList L,int i,ElemType &e){
    
    
	  //返回顺序表中的第i个元素
      if(i<1||i>L.length){
    
    
	  return ERROR;} 
      e=L.elem[i-1];
      return OK;
      }//GetElem
      
Status ListDelete(SqList &L,int i,ElemType&e){
    
    //删除顺序表中的第i个元素
      if(i<1||i>L.length){
    
    
      	return ERROR;
	  } 
      e=L.elem[i-1];
      for(i;i<L.length;i++){
    
    
       	L.elem[i-1]=L.elem[i];
       } 
      --L .length;
      return OK;
      }//ListDelete
      
Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e){
    
    
      //返回一个不是首元素的前驱
      int i=2;
      if(cur_e==L.elem[0]) {
    
    
      	return ERROR;
	  }
      while(i<=L.length&&(L.elem[i-1]!=cur_e)){
    
    
      	 i++;
	  }
     
      if(i==L.length+1){
    
    
	 	return ERROR;
	  }  
      else {
    
    
      	pre_e=L.elem[i-2];
	  }
      return OK;
      }//PriorElem
      
Status NextElem(SqList L,ElemType cur_e,ElemType &next_e){
    
    
      //返回一个不是末元素的后继
      int i=1;
      while(i<L.length&&(L.elem[i-1]!=cur_e)){
    
    
      	i++;
	  }
      if(i==L.length){
    
    
      	return ERROR;
	  }
      else{
    
    
      	next_e=L.elem[i];
	  }
      return OK;
      }//NextElem

Status ListEmpty(SqList L){
    
    
	      return L.length==0; //ListEmpty
}
//判断顺序表是否为空

Status ListLength(SqList L){
    
    
      //求顺序表的长度
      return L.length;
      }//ListLength
      
Status DestroyList(SqList &L){
    
    
      //销毁一个顺序表
      if (L.elem){
    
    
      	free(L.elem);
	  }
      L.elem=NULL;
      printf("此顺序表已被销毁。");
      printf("\n");
      return OK;
      }//DestroyList
     
Status ClearList(SqList &L ){
    
    
      //清空一个顺序表
      L.length=0;
      return OK; 
      }//ClearList
      
Status ListPrint(SqList &L) {
    
    
      printf("顺序表为:");
      if (ListEmpty(L)){
    
    
      printf("空。\n");
      return ERROR;}
      
      for (int i=0; i<L .length; ++i){
    
    
      printf("%-4d ", L.elem[i]);}
      printf("\n");
      return OK;}
      
      
int main()
{
    
    
SqList L;
ElemType a,b,c,d,e,f,pre_e,next_e; 
int i,j,k,l,m,menu;
char p,q,r,s;
int is_stop_;
InitList(L);
is_stop_= FALSE;
while (!is_stop_){
    
    
printf("\n"
" 1.添加元素     2.查看指定位置的元素\n"
" 3.删除元素     4.查找元素前驱\n"
" 5.查找元素后继 6.检查是否为空\n"
" 7.列出所有元素 8.查看列表长度\n"
" 9.清空表       \n"
"      0.释放列表内存(退出)\n");
printf( "***请选择***:\n");
scanf("%d" ,&menu);
switch (menu)
{
    
    
// "1. 添加元素;\n"
case 1:
      printf("请输入你想创建的顺序表中元素的个数:\n");
      scanf("%d",&i);
      if(i<1) printf("您输入的值有误,无法创建顺序表。\n");
      else
      {
    
    
        printf( "请您依次输入您想创建的顺序表的元素:\n");
           for(j=1;j<=i;j++){
    
    
              scanf(" %d",&a);
              ListInsert(L,L.length+1,a); 
               }}
    printf("\n");
     ListPrint(L);
     printf("\n");
       break;

// "2.查看指定位置的元素\n"
case 2:
      printf("请输入您想获取的元素的位序:\n");
      scanf("%d" ,&k);
      if(GetElem(L,k,b)) {
    
    
      	printf("\n");
      	printf( "获得的元素为:%d\n" ,b);
	  }
      else{
    
    
      	printf("\n");
      	printf("您输入的值有误,无法获取元素。\n");
	  }
      printf("\n");
      break;
      
// "3.删除元素\n"
case 3:
      printf("请输入您想删除的元素的位序:\n");
      scanf("%d",&l);
      if(ListDelete(L,l,c))
      {
    
    
      printf("删除的元素为:%d\n" ,c);
      printf("\n");
      printf("删除元素后的顺序表为:\n");
      ListPrint(L);}
      else {
    
    
      	printf("\n");
      	printf("您输入的值有误,无法删除元素。\n");
	  }
      printf("\n");
      break;

// "4.查找元素前驱\n"
case 4:
      printf("您想返回那个元素的前驱:\n");
      scanf("%d",&d);
      if(PriorElem(L,d,pre_e)) {
    
    
      	printf("\n");
      	printf( "元素%d的前驱为%d\n'",d,pre_e);
	  }
      else{
    
    
      	printf("\n");
      	printf("您输入的值有误,无法返回前驱。\n");
	  }
	  printf("\n");
      break;
      
// "5.查找元素后继\n"
case 5:
      printf("您想返回那个元素的后继:\n");
      scanf("%d",&e);
      if(NextElem(L,e,next_e)){
    
    
      	printf("\n");
      	printf("元素%d的后继为%d\n",e,next_e);
	  } 
      else{
    
    
      	printf("\n");
      	printf("您输入的值有误,无法返回后继。\n");
	  }
      break;
      
// "6.检查是否为空\n"
case 6:
      if(ListEmpty(L)){
    
    
      	printf("\n");
      	printf("此顺序表为空。\n");
	  }
      else{
    
    
      	printf("\n");
      	printf("此顺序表不为空。\n");
	  }
      printf("\n");
      break;
      
// "7.列出所有元素\n"
case 7:
      ListPrint(L);
      break;
      
//"8.查看列表长度\n"
case 8:
	  printf("\n");
      printf("此顺序表的长度为:%d\n",ListLength(L));
      printf("\n");
      break;

// " 9.清空表\n"
case 9:
      ClearList(L);
      printf("\n");
      printf( "顺序表已清空。\n"); 
      printf("\n");
      break; 

// "0.释放列表内存\n"
case 0:
	  printf("\n");
	  printf("Bye");
	  printf("\n");
      DestroyList(L);
      is_stop_ = TRUE;
      break;}
     }
DestroyList(L);}

猜你喜欢

转载自blog.csdn.net/GodOuO/article/details/107309777
今日推荐