顺序表的建立、输出、插入、删除


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