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


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.實驗結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM