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