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.实验结果