C语言实现对顺序表的增删改查


顺序表的概念

  • 采用顺序储存结构的线性表称为顺序表,他的数据元素按照逻辑顺序依次有放在一组连续的储存单元之中。逻辑上相邻的数据元素,其储存位置也彼此相邻

顺序表的主要算法

(1).在表中第i个位置插入新元素x

  • 第一步,判断插入位置的合理性以及表是否已满;
  • 第二步,从最后一个元素开始依次向前,将每个元素向后移动一个位置,直到第i个元素位置;
  • 第三步,向空出的第i个位置存入新元素x;
  • 第四步,最后还要将线性表长度加1;

    代码如下:

int Insert(int line[],int num,int length,int place){
    if(num<1||num>length+1){
        return -1;
    }else{
        int j;
        for(j=length-1;j>=place-1;j--){
            line[j+1]=line[j];
        }
        line[place-1]=num;
        return 1;
    }
}

(2).在表中删除第i个元素

- 第一步,判断删除位置的合理性;

- 第二步,从第i+1个元素开始,依次向后直到最后一个元素为止,将每个元素向前移动一个位置,这是第i个元素已经被删除覆盖;

- 第三步,最后还要将线性表长度减1;

代码如下:

int Delete(int line[],int num,int length){
    if(num<0||num>length){
        return 2;
    }else{
        int j;
        for(j=num;j<=length-1;j++){
            line[j-1]=line[j];
        }
        return 1;
    }
}

(3).在表中查找某个元素

  • 查找元素的情况相较于前面的算法来说相对要复杂一些。如果数据元素是整数、实数这些基本数据类型,那么查找元素时自然就是与数据元素本身进行对比。如果数据元素是包含多个属性的结构体或者对象,那么查找元素往往是与数据元素的某个属性比较。接下来演示的是相对的数据元素的直接比较的情况。

    代码如下

int Search(int line[],int num,int length){
    int i;
    for(i=0;i<=length;i++){
        if(line[i]==num){
            return i;
        }
    }
    return -1;
}

接下来贴出完整的示例代码:

#include <stdio.h>
#include <stdlib.h>
#define N 30
int Search(int line[],int num,int length);//传入数组,需要查找的元素,数组长度,
int Delete(int line[],int num,int length);//传入数组,需要删除的元素位置,数组长度
int Insert(int line[],int num,int length,int place);//传入数组,需要插入的数值,数组长度,插入位置
int Alter(int line[],int num,int length,int place);//传入数组,需要修改为的值,数组长度,修改的位置
void ReadLine(int line[],int length);//读取输入
void PrintLine(int line[],int length);//打印数组
int main()
{
    int n,m,num;
    int line[N];
    int length,place;
    while(1){
        printf("你需要执行的功能:\n1:删除一个元素\n2.查找一个元素\n3.输入数组元素\n4.查看数组元素\n5.插入一个元素\n6.修改数组中的元素\n");
        scanf("%d",&n);
        switch(n){
            case 1:
                printf("输入你需要删除的元素坐标\n");
                scanf("%d",&num);
                printf("\n");
                m=Delete(line,num,length);
                if(m!=2){
                    printf("success\n");
                    length=length-1;
                }else{
                    printf("false\n");
                }
                break;
            case 2:
                printf("输入需要查找的元素\n");
                scanf("%d",&num);
                m=Search(line,num,length);
                if(m<0){
                    printf("false!",m);
                }else{
                    printf("%d\n",m);
                }
                break;
            case 3:
                printf("输入数组长度\n");
                scanf("%d",&length);
                ReadLine(line,length);
                break;
            case 4:
                PrintLine(line,length);
                break;
            case 5:
                printf("输入您需要插入的位置\n");
                scanf("%d",&place);
                printf("输入您需要在该位置插入的元素");
                scanf("%d",&num);
                m=Insert(line,num,length,place);
                if(m>=0){
                    printf("插入成功\n");
                }else{
                    printf("插入失败\n");
                }
                length=length+1;
                break;
            case 6:
                printf("输入你需要修改的元素位置\n");
                scanf("%d",&place);
                printf("输入用来替换该位置的元素\n");
                scanf("%d",&num);
                m=Alter(line,num,length,place);
                if(m>=0){
                    printf("修改成功\n");
                }else{
                    printf("修改失败\n");
                }
                break;
            default:
                printf("输入错误,请重启程序!\n");
                return 0;

        }
    }
}
int Alter(int line[],int num,int length,int place){
    if(num<1||num>length+1){
        return -1;
    }else{
        line[place]=num;
        return 1;
    }
}
int Delete(int line[],int num,int length){
    if(num<0||num>length){
        return 2;
    }else{
        int j;
        for(j=num;j<=length-1;j++){
            line[j-1]=line[j];
        }
        return 1;
    }
}
int Insert(int line[],int num,int length,int place){
    if(num<1||num>length+1){
        return -1;
    }else{
        int j;
        for(j=length-1;j>=place-1;j--){
            line[j+1]=line[j];
        }
        line[place-1]=num;
        return 1;
    }
}
void ReadLine(int line[],int length){
    int i;
    for(i=0;i<length;i++){
        printf("输入数组元素\n");
        scanf("%d",&line[i]);
    }

}
int Search(int line[],int num,int length){
    int i;
    for(i=0;i<=length;i++){
        if(line[i]==num){
            return i;
        }
    }
    return -1;
}
void PrintLine(int line[],int length){
    int i;
    if(length>=N){
        printf("没有数组,请创建数组\n");
    }else{
        for(i=0;i<length;i++){
            printf("%3d",line[i]);
        }
        printf("\n");
    }

}