1. 程式人生 > >c語言——線性表之順序結構

c語言——線性表之順序結構

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//線性表——順序儲存
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 10
#define ERROR 0
#define OK 1
#define OVERFLOW -2

typedef struct{
    int *elem;
    int length;
    int listsize;
}Sqlist;
int destroy(Sqlist *L);
int  disPlay_all(Sqlist *L);
int InitList_Sq(Sqlist *L);
int get_length(Sqlist *L);
int ListInsert_Sq(Sqlist *L,int i,int e);
int ListDelete_Sq(Sqlist *L,int i,int e);

int InitList_Sq(Sqlist *L)
{
    int i;
    L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
    if(!L->elem)
        exit(OVERFLOW);
    L->length = 10;
    L->listsize = LIST_INIT_SIZE;
    for(i=0;i<L->length;i++)
    {
        L->elem[i]=i;
    }
    return OK;
}

int get_length(Sqlist *L)
{
    return L->length;
}

int destroy(Sqlist *L)
{
    L->length=0;
}

int ListInsert_Sq(Sqlist *L,int i,int e)
{
    int *newbase,*q,*p;
    if(i<1||i>L->length+1)
        return ERROR;
    if(L->length>=L->listsize)
    {
        newbase = (int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)
            exit(OVERFLOW);
        L->elem = newbase;
        L->listsize+=LISTINCREMENT;
    }
    q=&(L->elem[i-1]);
    for(p=&(L->elem[L->length-1]);p>=q;--p)
        *(p+1)=*p;
    *q =e;
    ++L->length;
    return OK;
}

int ListDelete_Sq(Sqlist *L,int i,int e)
{
    int *p,*q;
    if(i<1||i>L->length)
        return ERROR;
    p=&(L->elem[i-1]);
    e=*p;
    q=L->elem+L->length-1;
    for(++p;p<=q;++p)
    *(p-1)=*p;
    --L->length;
    return OK;
}

int  disPlay_all(Sqlist *L)
{
    int i;
    for(i=0;i<L->length;i++)
    {
        printf("%d",L->elem[i]);
        printf(" ");
    }
    return OK;
}

int main()
{
    Sqlist L;
    int get,e=0;
    int i,num;
    InitList_Sq(&L);
    printf("請輸入你要進行操作的序號\n");
     printf("1.線性表置空\n");
      printf("2.求線性表的長度\n");
       printf("3.資料元素的插入操作\n");
        printf("4.資料元素的刪除操作\n");
         printf("5.顯示線性表中的全部元素\n");
          printf("6.退出\n");
    scanf("%d",&get);
    switch(get)
    {
    case 1:
        destroy(&L);
        break;
    case 2:
        printf("該線性表的長度為:%d\n",get_length(&L));
        break;
    case 3:
        //在指定位置上插入指定的資料元素
        printf("輸入你要插入的元素的位置(即在第i個元素之前插入)以及插入元素(逗號隔開)");
        scanf("%d,%d",&i,&num);
        ListInsert_Sq(&L,i,num);
        printf("新的線性表是\n");
        disPlay_all(&L);
        break;
    case 4:
        //刪除指定位置的資料元素
        printf("請輸入你要刪除的元素的位置\n");
        scanf("%d",&i);
        ListDelete_Sq(&L,i,e);
        printf("新的線性表是\n");
        disPlay_all(&L);
        break;
    case 5:
        //顯示線性表的所有元素
        disPlay_all(&L);
        printf("\n");
    case 6:
        printf("退出\n");
        break;
    default :
        printf("無此操作!\n");
        break;
    }
    return OK;
}