顺序表的主要功能实现(用例子)

  1. 顺序表的创建

//顺序表的创建
typedef struct Stu
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char major[MAJOR_MAX];
    float GPA;
}Stu;
typedef struct SeqList
{
    Stu* p;
    int size;
    int capacity;
}SeqList;

2. 顺序表的初始化

//顺序表的初始化
void SeqListInit(SeqList* ps)
{
    assert(ps);
    ps->p = (Stu*)malloc(sizeof(Stu) * INIT_CAPACITY);
    if (ps->p == NULL)
    {
        perror("SeqListInit::Malloc");
        return;
    }
    ps->size = 0;
    ps->capacity = INIT_CAPACITY;
}

3. 顺序表的销毁

//顺序表的销毁
void SeqListDestroy(SeqList* ps)
{
    assert(ps);
    free(ps->p);
    ps->p = NULL;
    ps->size = 0;
    ps->capacity = 0;
}

4. 顺序表的打印

//顺序表的打印
void SeqListPrint(SeqList* ps)
{
    assert(ps);
    for (int i = 0; i < ps->size; i++)
    {
        printf("%-10s %-10s %-10d %-10s %.2f\n", (ps->p + i)->name, (ps->p + i)->sex, (ps->p + i)->age, (ps->p + i)->major, (ps->p + i)->GPA);
    }
}

5. 顺序表的插入(尾插)

//顺序表的插入(尾插)
void SeqListPushBack(SeqList* ps)
{
    assert(ps);
    if (ps->size == ps->capacity)
    {
        Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
        if (pp == NULL)
        {
            perror("SeqListPushBack::Realloc");
            return;
        }
        ps->p = pp;
        ps->capacity *= 2;
    }
    scanf("%s %s %d %s %f", (ps->p + ps->size)->name, (ps->p + ps->size)->sex, &((ps->p + ps->size)->age), (ps->p + ps->size)->major, &((ps->p + ps->size)->GPA));
    ps->size++;
}

6. 顺序表的插入(头插)

//顺序表的插入(头插)
void SeqListPushFront(SeqList* ps)
{
    assert(ps);
    if (ps->size == ps->capacity)
    {
        Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
        if (pp == NULL)
        {
            perror("SeqListPushBack::Realloc");
            return;
        }
        ps->p = pp;
        ps->capacity *= 2;
    }
    for (int i = ps->size; i >= 1; i--)
    {
        memmove(ps->p + i, ps->p + i - 1, sizeof(Stu));
    }
    scanf("%s %s %d %s %f", (ps->p)->name, (ps->p)->sex, &((ps->p)->age), (ps->p)->major, &((ps->p)->GPA));
    ps->size++;
}

7. 顺序表的插入(在第pos个位置后面插入)

//顺序表的插入(在第pos个位置后插入)
void SeqListPushPos(SeqList* ps)
{
    assert(ps);
    if (ps->size == ps->capacity)
    {
        Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
        if (pp == NULL)
        {
            perror("SeqListPushBack::Realloc");
            return;
        }
        ps->p = pp;
        ps->capacity *= 2;
    }
    int pos = 0;
    scanf("%d", &pos);
    for (int i = ps->size; i >= pos + 1; i--)
    {
        memmove(ps->p + i, ps->p + i - 1, sizeof(Stu));
    }
    scanf("%s %s %d %s %f", (ps->p + pos)->name, (ps->p + pos)->sex, &((ps->p + pos)->age), (ps->p + pos)->major, &((ps->p + pos)->GPA));
    ps->size++;
}

8. 顺序表的删除(尾删)

//顺序表的删除(尾删)
void SeqListPopBack(SeqList* ps)
{
    assert(ps);
    assert(ps->size > 0);
    ps->size--;
}

9. 顺序表的删除(头删)

//顺序表的删除(头删)
void SeqListPopFront(SeqList* ps)
{
    assert(ps);
    assert(ps->size > 0);
    for (int i = 0; i < ps->size - 1; i++)
    {
        memmove(ps->p + i, ps->p + i + 1, sizeof(Stu));
    }
    ps->size--;
}

10. 顺序表的删除(删除第pos个元素)

//顺序表的删除(删除第pos个元素)
void SeqListPopPos(SeqList* ps)
{
    assert(ps);
    assert(ps->size > 0);
    int pos = 0;
    scanf("%d", &pos);
    for (int i = pos - 1; i < ps->size - 1; i++)
    {
        memmove(ps->p + i, ps->p + i + 1, sizeof(Stu));
    }
    ps->size--;
}

11. 顺序表内元素的查找

//顺序表的查找(输入索引信息)
void SeqListFind(SeqList* ps)
{
    assert(ps);
    char inputname[NAME_MAX] = { 0 };
    scanf("%s", inputname);
    for (int i = 0; i < ps->size; i++)
    {
        if (strcmp(inputname, (ps->p + i)->name) == 0)
        {
            printf("%-10s %-10s %-10d %-10s %.2f\n", (ps->p + i)->name, (ps->p + i)->sex, (ps->p + i)->age, (ps->p + i)->major, (ps->p + i)->GPA);
            break;
        }
    }
}

完整的一个用顺序表的例子

#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>


#define NAME_MAX 20
#define SEX_MAX 10
#define MAJOR_MAX 20
#define INIT_CAPACITY 5


//顺序表的创建
typedef struct Stu
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char major[MAJOR_MAX];
    float GPA;
}Stu;
typedef struct SeqList
{
    Stu* p;
    int size;
    int capacity;
}SeqList;


//顺序表的初始化
void SeqListInit(SeqList* ps)
{
    assert(ps);
    ps->p = (Stu*)malloc(sizeof(Stu) * INIT_CAPACITY);
    if (ps->p == NULL)
    {
        perror("SeqListInit::Malloc");
        return;
    }
    ps->size = 0;
    ps->capacity = INIT_CAPACITY;
}


//顺序表的销毁
void SeqListDestroy(SeqList* ps)
{
    assert(ps);
    free(ps->p);
    ps->p = NULL;
    ps->size = 0;
    ps->capacity = 0;
}


//顺序表的打印
void SeqListPrint(SeqList* ps)
{
    assert(ps);
    for (int i = 0; i < ps->size; i++)
    {
        printf("%-10s %-10s %-10d %-10s %.2f\n", (ps->p + i)->name, (ps->p + i)->sex, (ps->p + i)->age, (ps->p + i)->major, (ps->p + i)->GPA);
    }
}


//顺序表的插入(尾插)
void SeqListPushBack(SeqList* ps)
{
    assert(ps);
    if (ps->size == ps->capacity)
    {
        Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
        if (pp == NULL)
        {
            perror("SeqListPushBack::Realloc");
            return;
        }
        ps->p = pp;
        ps->capacity *= 2;
    }
    scanf("%s %s %d %s %f", (ps->p + ps->size)->name, (ps->p + ps->size)->sex, &((ps->p + ps->size)->age), (ps->p + ps->size)->major, &((ps->p + ps->size)->GPA));
    ps->size++;
}


//顺序表的插入(头插)
void SeqListPushFront(SeqList* ps)
{
    assert(ps);
    if (ps->size == ps->capacity)
    {
        Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
        if (pp == NULL)
        {
            perror("SeqListPushBack::Realloc");
            return;
        }
        ps->p = pp;
        ps->capacity *= 2;
    }
    for (int i = ps->size; i >= 1; i--)
    {
        memmove(ps->p + i, ps->p + i - 1, sizeof(Stu));
    }
    scanf("%s %s %d %s %f", (ps->p)->name, (ps->p)->sex, &((ps->p)->age), (ps->p)->major, &((ps->p)->GPA));
    ps->size++;
}


//顺序表的插入(在第pos个位置后插入)
void SeqListPushPos(SeqList* ps)
{
    assert(ps);
    if (ps->size == ps->capacity)
    {
        Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
        if (pp == NULL)
        {
            perror("SeqListPushBack::Realloc");
            return;
        }
        ps->p = pp;
        ps->capacity *= 2;
    }
    int pos = 0;
    scanf("%d", &pos);
    for (int i = ps->size; i >= pos + 1; i--)
    {
        memmove(ps->p + i, ps->p + i - 1, sizeof(Stu));
    }
    scanf("%s %s %d %s %f", (ps->p + pos)->name, (ps->p + pos)->sex, &((ps->p + pos)->age), (ps->p + pos)->major, &((ps->p + pos)->GPA));
    ps->size++;
}


//顺序表的删除(尾删)
void SeqListPopBack(SeqList* ps)
{
    assert(ps);
    assert(ps->size > 0);
    ps->size--;
}


//顺序表的删除(头删)
void SeqListPopFront(SeqList* ps)
{
    assert(ps);
    assert(ps->size > 0);
    for (int i = 0; i < ps->size - 1; i++)
    {
        memmove(ps->p + i, ps->p + i + 1, sizeof(Stu));
    }
    ps->size--;
}


//顺序表的删除(删除第pos个元素)
void SeqListPopPos(SeqList* ps)
{
    assert(ps);
    assert(ps->size > 0);
    int pos = 0;
    scanf("%d", &pos);
    for (int i = pos - 1; i < ps->size - 1; i++)
    {
        memmove(ps->p + i, ps->p + i + 1, sizeof(Stu));
    }
    ps->size--;
}


//顺序表的查找(输入索引信息)
void SeqListFind(SeqList* ps)
{
    assert(ps);
    char inputname[NAME_MAX] = { 0 };
    scanf("%s", inputname);
    for (int i = 0; i < ps->size; i++)
    {
        if (strcmp(inputname, (ps->p + i)->name) == 0)
        {
            printf("%-10s %-10s %-10d %-10s %.2f\n", (ps->p + i)->name, (ps->p + i)->sex, (ps->p + i)->age, (ps->p + i)->major, (ps->p + i)->GPA);
            break;
        }
    }
}


//菜单
void menu()
{
    printf("***************************** \n");
    printf("1. 头插    2. 尾插    3. 自由插\n");
    printf("4. 头删    5. 尾删    6. 自由删\n");
    printf("7. 查找    8. 打印    0. 退出  \n");
    printf("*****************************\n");
}


int main()
{
    SeqList SL;
    SeqList* ps = &SL;
    int input = 0;
    SeqListInit(ps);
    do
    {
        menu();
        scanf("%d",&input);
        switch (input)
        {
        case 1:
            SeqListPushFront(ps);
            break;
        case 2:
            SeqListPushBack(ps);
            break;
        case 3:
            SeqListPushPos(ps);
            break;
        case 4:
            SeqListPopFront(ps);
            break;
        case 5:
            SeqListPopBack(ps);
            break;
        case 6:
            SeqListPopPos(ps);
            break;
        case 7:
            SeqListFind(ps);
            break;
        case 8:
            SeqListPrint(ps);
            break;
        case 0:
            break;
        default:
            printf("请重新输入:");
        }
    } while (input);
    return 0;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

絕知此事要躬行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值