天天看點

資料結構--順序表的操作

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define  ERROR 0

#define LIST_INIT_SIZE 100

#define LISTINCREACEMENT 10

#define OK 1

#define OVERFLOW 1

typedef int ElemType;

typedef struct {

 ElemType *elem;//存儲空間首位址

int length;//目前長度

int listsize;//目前可配置設定的存儲容量

}Sqlist;

int InitList(Sqlist &L);

int ListInsert(Sqlist &L,int i,ElemType e);

int ListDelete(Sqlist &L,int i);

void main()

{

 Sqlist L;

    ElemType e,z;

 int n,i=0,j=0;

 int x,y,w;

 if(InitList(L))

 {

 printf("                初始化順序表成功         /n");

 }

    printf("請輸入順序表的長度n:/n");

 scanf("%d",&n);

 printf("請輸入n個數:/n");

    for(;i<n;i++)

 {

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

  ++L.length;

      }

 for(;j<n;j++)

 {

 if(j%5==0){

  printf("/n");

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

 }

 else{

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

 }

}

  printf("/n");

  printf("請輸入要查詢表中具體的值:");

  scanf("%d",&e);

  for(z=1;z<L.length;z++)

  {

 if(L.elem[z]==e)

  printf("該值的具體位序:%d/n",z);

  }

    printf("/n");

    printf("請輸入你要插入的位置和值:");

    scanf("%d%d",&x,&y);

   ListInsert(L,x,y);

   for(int k=0;k<L.length;k++)

   {

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

   }

   printf("/n");

   do{

    printf("請輸入你要删除的位序:/n");

       scanf("%d",&w);

        ListDelete(L,w);//删除表中具體的值。

    if(w>0)

 {

  for(int v=0;v<L.length;v++)

   {

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

   }

 }

   }while(w>0);

printf("   将順序表逆序:  /n");

for(int g=0;g<L.length/2;g++)//将順序表逆序。

{

 int m;

 m=L.elem[g];

    L.elem[g]=L.elem[L.length-1-g];

    L.elem[L.length-1-g]=m;

}

 for(int v=0;v<L.length;v++)

   {

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

   }

}

//構造一個空的順序表

int 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;

}

int ListInsert(Sqlist &L,int i,ElemType e)

{int *p,*q,*newbase;

if (i<1||i>L.length)return ERROR;//判斷i得知是否合法;

if (L.length>=L.listsize)

{

 newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREACEMENT)*sizeof(ElemType));

   if(!newbase)exit(OVERFLOW);

   L.elem=newbase;

   L.listsize+=LISTINCREACEMENT;

 }

q=&(L.elem[i-1]);

for(p=&(L.elem[L.length-1]);p>=q;--p)

*(p+1)=*p;//插入位置向右移

*q=e;//插入e;

++L.length;

return OK;

}

int ListDelete(Sqlist &L,int i)

{

 int *p,*q;

 if(i<1||i>L.length)return ERROR;

 p=&L.elem[i-1];//p為被删除的位置;

    q=&(L.elem[L.length-1]);

 for(++p;p<=q;++p)

    {

 *(p-1)=*p;

 }

 --L.length;

 return OK;

}