天天看點

C語言實作順序表函數介紹詳細代碼

函數介紹

  • InsList---->在索引為i的位置插入元素e
  • delete---->删除索引為i的元素
  • GetData---->傳回指定索引的元素
  • Locate---->傳回指定元素的索引
  • Merge---->傳回一個SeqList,通過兩個升序SeqList合并而來

詳細代碼

#include <stdio.h>
#include <stdlib.h>

//宏定義常量
#define maxsize 20

typedef struct SeqList{
    int elem[maxsize]; /* 線性表占用的數組空間*/
    int last; /*最後一個元素在數組中的位置(下标值),空表置為-1*/
} SeqList;



//插入元素,在索引為i的位置插入元素e
int InsList(SeqList *L, int i, int e){
    int k;
    //首先判斷插入位置是否合法
    if((i<0) || (i>=L->last+2)){
        printf("插入位置i值不合法");
        return 0;
    }
    if(L->last>=maxsize-1){
        printf("表已滿無法插入");
        return 0;
    }
    //為插入元素而移動位置
    //從最後開始移動,一個個元素一點點往後搬家
    //1 2 3 4 5---->1 2 7 3 4 5
    for(k=L->last;k>=i;k--){
        L->elem[k+1]=L->elem[k];
    }
    //添加元素
    L->elem[i]=e;
    //修改長度
    L->last++;
    return 1;
}


//删除索引下的元素
int delete(SeqList *L,int index) {
    if((index<0)||(index>L->last)){
        printf("删除位置不合法!");
        return 0;
    }
    int pop=L->elem[index];
    //将後面的元素依次前移
    for(int i=index;i<=L->last;i++){
        L->elem[i-1]= L->elem[i];
    }
    L->last--;
}


//按索引查找
int GetData(SeqList *L,int i) {
    return L->elem[i];
}
//按内容查找第一次出現的索引,找不到傳回-1
int Locate(SeqList *L,int e) {
    for (int i=0;i<L->last;i++) {
        if(L->elem[i]==e) {
            return i;
        }
    }
    return -1;
}


//合并
SeqList Merge(SeqList *LA, SeqList *LB) {
    SeqList LC;
    int i=0,j=0,k=0;
    while(i<=LA->last&&j<=LB->last) {
        if(LA->elem[i]<=LB->elem[j]){
            LC.elem[k]= LA->elem[i]; i++;
        }else{
            LC.elem[k]=LB->elem[j]; j++;
        }
        k++;
    }
    //當表LA長則将表LA餘下的元素賦給表LC
    while(i<=LA->last){
        LC.elem[k]= LA->elem[i]; i++; k++;
    }
    //當表LB長則将表LB餘下的元素賦給表LC
    while(j<=LB->last){
        LC.elem[k]= LB->elem[j]; j++; k++;
    }
    LC.last=k-1;
    return LC;
}


//輸出順序表
void printSeqList(SeqList *L) {
    for (int i=0;i<=L->last;i++) {
        printf("%d ",L->elem[i]);
    }
}


int main(void) {
    SeqList L;
    L.last=-1;
    InsList(&L,0,1);
    InsList(&L,1,1);
    printSeqList(&L);
	return 0;
}

           

繼續閱讀