1. 程式人生 > 實用技巧 >順序表的建立、輸出、插入、刪除

順序表的建立、輸出、插入、刪除

1.順序表的建立,一定要記得要分配記憶體,然後就把輸入的數插入進去就可以了。

//建立順序表 
Status InitList_Sq(SqList &L,int n){
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配記憶體
    if(!L.elem)exit(OVERFLOW);//判斷是否溢位
    printf("請輸入順序表中元素:");
    for(int i=0;i<n;i++){
        scanf("%d",&L.elem[i]);
    }
    L.length
=n; L.listsize=LIST_INIT_SIZE; return OK; }

2.插入元素的時候,要判斷位置是否有效,還要注意記憶體分配的問題,要判斷,如果記憶體不夠他插入新的元素就要重新分配記憶體,然後插入要從最後一個往下移,倒數第二個移到倒數第一個.......順序不要弄反了。

//順序表的插入
Status InsertList_Sq(SqList &L,int i,ElemType e){
    if(i<1||i>L.length+1)return ERROR;//判斷位置是否有效 
    if(L.length>=L.listsize){//
判斷是否需要重新分配記憶體 ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//重新分配記憶體,這裡newbase對應的是elem,所以定義的時候必須是ElemType *newbase if(!newbase)exit(OVERFLOW);//重新分配完之後還要判斷是否溢位 L.elem=newbase;//把新的記憶體賦給L.elem L.listsize+=LISTINCREMENT; } ElemType
*q=&(L.elem[i-1]);//定義一個指標指向需要插入的位置 ElemType *p=&(L.elem[L.length-1]);//定義一個指標指向指標的末尾 for(p;p>=q;p--){ *(p+1)=*p;//就是把倒數第一賦給倒數第二,倒數第三賦給倒數第二...... } *q=e;//最後吧需要插入的元素的值賦給q L.length++;//順序表的長度加一 return OK; }

3.刪除的時候還是要先判斷刪除的位置是否有效,然後就找到刪除的位置,讓他下面的元素依次往上賦值

//順序表的刪除
Status DeleteList_Sq(SqList &L,int i){
    if(i<1||i>L.length)return ERROR;//判斷位置是否有效 
    ElemType *p=&(L.elem[i-1]);//定義一個指標指向要刪除位置 
    ElemType *q=&(L.elem[L.length-1]);//定義一個指標指向順序表的末尾 
    for(p;p<=q;p++){
        *p=*(p+1);//將刪除位置以下的元素依次向上賦值 
    }
    L.length--;//順序表的長度減一 
    return OK;
} 

4.總的程式碼為

#include <stdio.h>
#include<malloc.h>//分配記憶體的時候需要使用 
#include <iostream>//exit需要使用 
#define OK 1
#define ERROR 0
#define OVERFLOW -1//判斷是否溢位的時候要使用 
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 100
typedef int ElemType;
typedef int Status;
typedef struct{
    ElemType *elem;
    int length;
    int listsize;
}SqList;
//建立順序表 
Status InitList_Sq(SqList &L,int n){
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配記憶體 
    if(!L.elem)exit(OVERFLOW);
    printf("請輸入順序表中元素:");
    for(int i=0;i<n;i++){
        scanf("%d",&L.elem[i]);
    }
    L.length=n;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}
//輸出順序表中的元素
Status ExitList_Sq(SqList L){
    for(int i=0;i<L.length;i++){
        printf("%d ",L.elem[i]);
    }
    printf("\n");
} 
//順序表的插入
Status InsertList_Sq(SqList &L,int i,ElemType e){
    if(i<1||i>L.length+1)return ERROR;//判斷位置是否有效 
    if(L.length>=L.listsize){//判斷是否需要重新分配記憶體 
        ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//重新分配記憶體,這裡newbase對應的是elem,所以定義的時候必須是ElemType *newbase 
        if(!newbase)exit(OVERFLOW);//重新分配完之後還要判斷是否溢位 
        L.elem=newbase;//把新的記憶體賦給L.elem 
        L.listsize+=LISTINCREMENT; 
    }
    ElemType *q=&(L.elem[i-1]);//定義一個指標指向需要插入的位置 
    ElemType *p=&(L.elem[L.length-1]);//定義一個指標指向指標的末尾 
    for(p;p>=q;p--){
        *(p+1)=*p;//就是把倒數第一賦給倒數第二,倒數第三賦給倒數第二...... 
    }
    *q=e;//最後吧需要插入的元素的值賦給q 
    L.length++;//順序表的長度加一 
    return OK;    
} 
//順序表的刪除
Status DeleteList_Sq(SqList &L,int i){
    if(i<1||i>L.length)return ERROR;//判斷位置是否有效 
    ElemType *p=&(L.elem[i-1]);//定義一個指標指向要刪除位置 
    ElemType *q=&(L.elem[L.length-1]);//定義一個指標指向順序表的末尾 
    for(p;p<=q;p++){
        *p=*(p+1);//將刪除位置以下的元素依次向上賦值 
    }
    L.length--;//順序表的長度減一 
    return OK;
} 
int main(){
    SqList L;
    int n;
    printf("請輸入順序表中元素的個數:");
    scanf("%d",&n);
    InitList_Sq(L,n);//建立順序表
    ExitList_Sq(L);
    int i;
    ElemType e;//順序表的插入
    printf("請輸入想插入的位置:");
    scanf("%d",&i);
    printf("請輸入想插入的元素:");
    scanf("%d",&e);
    InsertList_Sq(L,i,e);
    ExitList_Sq(L);
    printf("請輸入想刪除的位置:");//順序表的刪除
    int m;
    scanf("%d",&m);
    DeleteList_Sq(L,m);
    ExitList_Sq(L);
}
 

5.實驗結果