数据结构线性表的ADT

    技术2022-05-20  64

    #include <stdio.h>

    #include <stdlib.h>

     

    typedef int type;

    #define LIST_SIZE 100

    #define LIST_ADD  10

     

    struct SqList{

        type *elem;

        int length;

        int size;   

    };

     

    void InitList_Sq(SqList &L);

    void DestroyList(SqList &L);

    void ClearList(SqList &L); 

    void ListEmpty(SqList L);

    void  ListLength(SqList L);

    void GetElem(SqList L,int i,type &e);

    int  LocateElem(SqList L,type e);

    void PriorElem(SqList L,type cur_e,type &pre_e);

    void NextElem(SqList L,type cur_e,type &next_e);

    void ListInsert(SqList &L,int i,type e);

    void ListDelete(SqList &L,int i,type &e);

    void LsitTraverse(SqList L);

    void menu(); 

     

    int main(){

        SqList L;  type e,cur_e;  int i;

        int choice(1);

        menu();

        while(choice){            

             printf("请选择功能:");

             scanf("%d",&choice);

             switch(choice){

                 case 1:InitList_Sq( L );  break;

                 case 2:DestroyList( L );  break;

                 case 3:ClearList( L );    break;

                 case 4:ListEmpty( L );    break;

                 case 5:ListLength( L );   break;

                 case 6:int i; type e;

                        printf("输入数据序号:");

                        scanf("%d",&i);  GetElem( L, i, e);

                        printf("/n第%d个数据:%d",i,e);  break;

                 case 7:int p;

                        printf("输入数据:");

                        scanf("%d",e);  p=LocateElem( L, e);

                        printf("/n数据%d的序号:%d",e,p);  break;

                 case 8:type pre_e;

                        printf("输入数据:");

                        scanf("%d",cur_e); PriorElem( L, cur_e, pre_e);

                        printf("/n数据%d的前驱:%d",cur_e,pre_e);  break;

                 case 9:type next_e;

                        printf("输入数据:");

                        scanf("%d",cur_e); NextElem( L, cur_e, next_e);

                        printf("/n数据%d的前驱:%d",cur_e,next_e); break;

                 case 10:printf("输入插入位置和数据:");

                         scanf("%d%d",&i,&e);

                         ListInsert( L, i, e);  break;

                 case 11:printf("输入删除位置:");

                         scanf("%d",&i);

                         ListInsert( L, i, e);

                         printf("/n删除的数据:%d",e);  break;

                 case 12:printf("所有数据信息:/n");

                         LsitTraverse( L ); break; 

             }

        }

    }

     

    void InitList_Sq(SqList &L){

         L.elem=(type *)malloc(LIST_SIZE*sizeof(type));

         if(!L.elem) exit(-2);

         L.length=0;

         L.size=LIST_SIZE;

         printf("构造完成!/n");

    }

     

    void DestroyList(SqList &L){

         if(!L.elem) exit(-2);

            free(L.elem);

         printf("销毁完成!/n");

    }

     

    void ClearList(SqList &L){

         if(!L.elem) exit(-2);

         L.length=0;

         printf("清空完成!/n");

    }

     

    void ListEmpty(SqList L){

         if(!L.elem) exit(-2);

         if(L.length) printf("该表非空!/n");

         else printf("该表为空!/n"); 

    }

     

    void ListLength(SqList L){

        if(!L.elem) exit(-2);

        printf("该表的长度:%d/n",L.length);

    }

    void GetElem(SqList L,int i,type &e){

         if(!L.elem) exit(-2);

         if(i>L.length) exit(-2);

         e=L.elem[i];

    }

    int  LocateElem(SqList L,type e){

         if(!L.elem) exit(-2);

         for(int i=1;i<=L.length;i++)

            if(L.elem[i]==e)  return i;

         return 0;

    }

    void PriorElem(SqList L,type cur_e,type &pre_e){

         if(!L.elem) exit(-2);

         for(int i=2;i<=L.length;i++)

            if(L.elem[i]==cur_e)

             { pre_e=L.elem[i-1];  return ;}

    }

    void NextElem(SqList L,type cur_e,type &next_e){

         if(!L.elem) exit(-2);

         for(int i=1;i<L.length;i++)

            if(L.elem[i]==cur_e)

            {next_e=L.elem[i+1];  return ;}

    }

    void ListInsert(SqList &L,int i,type e){   

         if(L.length==L.size){

           L.elem=(type *)realloc(L.elem,(L.size+LIST_ADD)*sizeof(type));

           L.size+=LIST_ADD;

         }

         if(!L.length) {L.elem[1]=e;   L.length++; return;}

         if(!L.elem||i<1||i>L.length) exit(-2);

         for(int j=L.length+1;j>i;j--)

            L.elem[j]=L.elem[j-1];

         L.elem[i]=e;

         L.length++;

    }

    void ListDelete(SqList &L,int i,type &e){

         if(!L.elem||i<1||i>L.length) exit(-2);

         e=L.elem[i];

         for(int j=i;j<L.length;j++)

            L.elem[j]=L.elem[j+1];

         L.length--;

    }

    void LsitTraverse(SqList L){

         if(!L.elem) exit(-2);

         for(int i=1;i<=L.length;i++)

            printf("%d ",L.elem[i]);

            printf("/n");

    }

    void menu(){

         printf("/t/t功能菜单/n");

         printf("/t1.构造表/n");

         printf("/t2.销毁表/n");

         printf("/t3.清空表/n");

         printf("/t4.表空判断/n");

         printf("/t5.表长/n");

         printf("/t6.取数据/n");

         printf("/t7.元素位置/n");

         printf("/t8.前驱/n");

         printf("/t9.后继/n");

         printf("/t10.插入/n");

         printf("/t11.删除/n");

         printf("/t12.遍历/n");

    }


    最新回复(0)