《C语言》顺序表(插入/删除/修改/查找等基本操作)

顺序表的存储结构是顺序存储结构,可实现数据元素的随机存取。

一、空间

  • 存储空间:预先分配,会导致空间闲置或溢出现象(数组)。
  • 存储密度:不用为表示节点间的逻辑关系而增加额外的存储开销,存储密度等于1。

二、时间

  • 存取元素:随机存取,按位置(或下标)访问元素的时间复杂度为O(1)。
  • 插入、删除:平均运动约表中一半元素,时间复杂度为O(n)。

三、适用情况

  • 表长变化不大,且能事先确认变化的范围。
  • 很少进行插入或者删除操作,一般用于按元素位置序号访问数据元素。

下面是我自己敲的代码,有错误望指正。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#include <string.h>
#define MAX 100

typedef struct student
{
    int number;  //学号
    char name[16];  //名字
    float grade;  //成绩
}sqlist;

typedef struct head{
    sqlist elem[MAX];
    int length;
}list;

void print();  //打印
void initList_Sq(list *L);  //初始化
void add_student(list *L);  //添加
void always_student(list *L);  //全部
void seek_student(list *L);  //查找
void signal_student(list *L);  //讯号查找
void insert_student(list *L);  //插入
void delete_student(list *L);  //删除
void count_student(list *L);  //统计
void revise_student(list *L);  //修改
void over_student(list *L);  //结束

int main()
{
    list L;
    int select;
    initList_Sq(&L);  //初始化

    do
    {
        print();
        scanf("%d", &select);

        switch(select)
        {
            case 1:
                add_student(&L);
                break;
            case 2:
                always_student(&L);
                break;
            case 3:
                seek_student(&L);
                break;
            case 4:
                signal_student(&L);
                break;
            case 5:
                insert_student(&L);
                break;
            case 6:
                delete_student(&L);
                break;
            case 7:
                count_student(&L);
                break;
            case 8:
                revise_student(&L);
                break;
            case 0:
                over_student(&L);
                break;
        }
    }
    while(select);

    return 0;
}

void print()
{
    printf("----------------------\n");
    printf("--- 请输入功能序号 ---\n");
    printf("--- 1 添加 add     ---\n");
    printf("--- 2 全部 always  ---\n");
    printf("--- 3 查找 seek    ---\n");
    printf("--- 4 序号 signal  ---\n");
    printf("--- 5 插入 insert  ---\n");
    printf("--- 6 删除 delete  ---\n");
    printf("--- 7 统计 count   ---\n");
    printf("--- 8 修改 revise  ---\n");
    printf("--- 0 退出 over    ---\n");
    printf("----------------------\n");
}

void initList_Sq(list *L)  //初始化
{
    L->length = 0;
    return;
}

void add_student(list *L)  //表尾添加
{
    int i, j, num;

    printf("-- number of added ---\n"); //多少个同学
    scanf("%d", &num);

    j = L->length;
    for(i = j; i < num + j; i++)  //输入添加信息
    {
        char name[16];
        printf("number: %d\n", i+1);
        L->elem[i].number = i + 1;
        printf("input name\n");
        scanf("%s", name);
        strcpy(L->elem[i].name, name);
        printf("input grade\n");
        scanf("%f", &L->elem[i].grade);
    }
    L->length = j + num;
}

void always_student(list *L)  //显示全部
{
    int i;

    for(i = 0; i < L->length; i++)
    {
        printf("number: %d\n", L->elem[i].number);
        printf("  name: %s\n", L->elem[i].name);
        printf(" grade: %.2f\n", L->elem[i].grade);
    }
}

void seek_student(list *L)  //查找
{
    int i, sel, num;
    char name[16];

    printf("1 number / 2 name\n");
    scanf("%d", &sel);

    if(sel == 1)
    {
        printf("input number\n");
        scanf("%d", &num);

        if(L->elem[num-1].number != 0)
        {
            printf("number: %d\n", L->elem[num-1].number);
            printf("  name: %s\n", L->elem[num-1].name);
            printf(" grade: %.2f\n", L->elem[num-1].grade);
        }

        else
        {
            printf("haven't student\n");
        }
    }

    if(sel == 2)  //错误
    {
        printf("input name\n");
        scanf("%s", name);

        for(i = 0; i < L->length; i++)
        {
            if(strcmp(name, L->elem[i].name) == 0)
            {
                printf("number: %d\n", L->elem[i].number);
                printf("  name: %s\n", L->elem[i].name);
                printf(" grade: %.2f\n", L->elem[i].grade);
                break;
            }
        }
    }
}

void signal_student(list *L)  //讯号查找
{
    int num;

    printf("input number\n");
    scanf("%d", &num);

    printf("number: %d\n", L->elem[num-1].number);
    printf("  name: %s\n", L->elem[num-1].name);
    printf(" grade: %.2f\n", L->elem[num-1].grade);
}

void insert_student(list *L)  //插入
{
    int i, num;
    char name[16];

    printf("input insert number\n");  //插入在第几个
    scanf("%d", &num);

    for(i = L->length; i >= num; i--)
    {
        L->elem[i].number = L->elem[i-1].number + 1;
        strcpy(L->elem[i].name, L->elem[i-1].name);
        L->elem[i].grade = L->elem[i-1].grade;
    }

    L->elem[num-1].number = num;
    printf("input name\n");
    scanf("%s", name);
    strcpy(L->elem[num-1].name, name);
    printf("input grade\n");
    scanf("%f", &L->elem[num-1].grade);
    L->length++;
    printf("completes insert\n");
}

void delete_student(list *L)  //删除
{
    int i, num;

    printf("delete number\n");
    scanf("%d", &num);

    for(i = num-1; i < L->length; i++)
    {
        L->elem[i].number = L->elem[i+1].number - 1;
        strcpy(L->elem[i].name, L->elem[i+1].name);
        L->elem[i].grade = L->elem[i+1].grade;
    }
    L->length--;
}

void count_student(list *L)  //统计
{
    printf("%d", L->length);
}

void revise_student(list *L)  //修改
{
    int num, sel;
    char name[16];

    printf("1 number / 2 name\n");
    scanf("%d", &sel);

    if(sel == 1)
    {
        printf("input number\n");
        scanf("%d", &num);

        printf("originally name\n");  //修改名字
        printf("input revise name\n");
        scanf("%s", name);
        strcpy(L->elem[num-1].name, name);

        printf("originally grade\n");  //修改成绩
        printf("input revise grade\n");
        scanf("%f", &L->elem[num-1].grade);
    }
    else if(sel == 2)
    {
        int i;

        printf("input name\n");
        scanf("%s", name);

        for(i = 0; i < L->length; i++)
        {
            if(strcmp(L->elem[i].name, name) == 0)
            {
                printf("originally name\n");  //修改名字
                printf("input revise name\n");
                scanf("%s", name);
                strcpy(L->elem[i].name, name);

                printf("originally grade\n");  //修改成绩
                printf("input revise grade\n");
                scanf("%f", &L->elem[i].grade);
            }
        }
    }
    else
    {
        printf("selection error\n");  //输入错误
    }
}

void over_student(list *L)  //关闭
{
    free(L);
    exit(0);
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
顺序表是一种常见的线性存储结构,可以用于实现顺序的插入删除查找操作。以下是用C语言实现顺序表的示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int length; } SeqList; //初始化顺序表 void initList(SeqList *list) { list->length = 0; } //插入元素 void insert(SeqList *list, int element, int position) { if (list->length >= MAX_SIZE) { printf("顺序表已满,无法插入新元素\n"); return; } if (position < 1 || position > list->length + 1) { printf("插入位置错误\n"); return; } for (int i = list->length; i >= position; i--) { list->data[i] = list->data[i-1]; //后移元素 } list->data[position-1] = element; list->length++; } //删除元素 void removeElement(SeqList *list, int position) { if (position < 1 || position > list->length) { printf("删除位置错误\n"); return; } for (int i = position; i < list->length; i++) { list->data[i-1] = list->data[i]; //前移元素 } list->length--; } //查找元素 int search(SeqList *list, int element) { for (int i = 0; i < list->length; i++) { if (list->data[i] == element) { return i+1; //返回元素位置 } } return -1; //未找到返回-1 } int main() { SeqList list; initList(&list); insert(&list, 1, 1); insert(&list, 2, 2); insert(&list, 3, 3); removeElement(&list, 2); int position = search(&list, 3); printf("元素3在位置%d\n", position); return 0; } ``` 以上代码实现了顺序表的初始化、插入删除查找基本操作。可以根据需要修改代码中的MAX_SIZE来改变顺序表的最大长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬夜学习真君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值