数据结构线性顺序表的Linux Ubuntu C语言实现

一、数据结构的两种结构类型


1.逻辑结构

① 集合结构:一个范围内,每一个个体之间没有任何关联

② 线性结构:一对一的关系,有唯一前驱和后继

第一个元素没有前驱,最后一个元素没有后继,中间元素既有唯一前驱,也有唯一后继

③ 树形结构:一对多的关系

第一个元素没有前驱,最后一个元素没有后继,中间元素有唯一前驱,但是可以有多个后继

④ 图形结构:多对多的关系,各个元素之间可能都有关联

2.存储结构

①顺序存储

特点:元素和元素之间依次存放

实现方法:数组、malloc

优点:数据查找和修改比较方便

缺点:浪费资源空间

插入数据、删除数据效率低

②链式存储

特点:在内存中的每一个元素之间用地址进行关联

优点:节省资源空间,插入数据、删除数据效率高

缺点:数据查找和修改效率低,需要遍历全部数据

③ 索引存储

特点:每一个元素都会创建一张索引表,资源开销比较大,

优点:数据查找效率高

④Hash存储(散列存储)

二、顺序表的抽象模型:


struct seqlist

{

int buf[50]; //定义表的大小

int last; //定义表尾指针,指向表中最后一个元素

}

三、seqlist.h头文件代码


#ifndef  __SEQLIST__
#define  __SEQLIST__

#define N 64
typedef int data_t;

typedef struct seqlist
{
    data_t buf[N];   //定义表长
    int last;   //定义表尾指针last,指向表中最后一个元素下标
}SeqList;

SeqList *Create_Seqlist();   //创建表

void Seqlist_Insert_Pos(SeqList *seq, int pos, data_t data); // 插入表

int Seqlist_Is_Full(SeqList *seq); //判断该表是否为满表

int Seqlist_Is_Empty(SeqList *seq);//判空

void Seqlist_Delete_Pos(SeqList *seq, int pos); //按位置删除表中元素

void Seqlist_Delete_Data(SeqList *seq, data_t data);//按值删除表中元素

data_t SeqList_Find_Pos(SeqList *seq, int pos);//查找表中元素 (按位置查找)

void Seqlist_Edit_Pos(SeqList *seq, int pos, data_t data); //修改表中元素 (按位置修改)

void Seqlist_Memset(SeqList *seq); //清空表

void Seqlist_Delete(SeqList *seq); //删除表

void Show_Seqlist(SeqList *seq);  //打印表

四、seqlist.c函数实现代码


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "seqlist.h"

SeqList *Create_Seqlist()   //创建表
{
    SeqList *seq = (SeqList *)malloc(sizeof(SeqList)); //给顺序表在堆区开辟空间
    if(NULL == seq)
    {
        printf("malloc error!\n");
        return NULL;
    }

    memset(seq->buf, 0, sizeof(seq->buf));  //从buf地址开始,将sizeof(buf)这么大的空间全部赋值为0

    seq->last = -1;  //将表尾指针赋值为-1,表示该表为一张空表

    return seq;	//返回顺序表的首地址
}

int Seqlist_Is_Full(SeqList *seq) //判断该表是否为满表
{
    if(seq->last == N-1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void Seqlist_Insert_Pos(SeqList *seq, int pos, data_t data) // 插入表
{
    if(pos != 0)
    {
        if((pos < 0) || (pos > seq->last+1))  //判断插入是否合法
        {
            printf("pos error!\n");
            return;
        }
    }
    if(Seqlist_Is_Full(seq) == 1)   //判满
    {
        printf("seqlist is full!!!\n");
        return;
    }

    int i = 0;

    for(i = seq->last; i >= pos; i--)
    {
        seq->buf[i+1] = seq->buf[i];
    }

    seq->buf[pos] = data;

    seq->last++;
}

int Seqlist_Is_Empty(SeqList *seq)//判空
{
    if(seq->last == -1){
        return 1;
    }
    else
        return 0;
}
void Seqlist_Delete_Pos(SeqList *seq, int pos) //按位置删除表中元素
{
        if((pos < 0) || (pos > seq->last))  //判断插入是否合法
        {
            printf("pos error!\n");
            return;
        }
    }
    for(int i = pos; i < seq->last; i++){
        seq->buf[i] = seq->buf[i+1];
    }
            seq->last--;
    return;
}

void Seqlist_Delete_Data(SeqList *seq, data_t data)//按值删除表中元素
{    
    int i, k = 0;
    for(i = 0; i <= seq->last; i++){
        if(seq->buf[i] == data){
            for(int j = i; j < seq->last; j++){
                seq->buf[j] = seq->buf[j+1];
            }
            k++;
            seq->last--;
        }
    }
    if(k == 0){
        printf("该值不存在!\n");
    }
    return;
}

data_t SeqList_Find_Pos(SeqList *seq, int pos)//查找表中元素 (按位置查找)
{
        if((pos < 0) || (pos > seq->last))  //判断插入是否合法
        {
            printf("pos error!\n");
            return;
        }
    return seq->buf[pos];
}

void Seqlist_Edit_Pos(SeqList *seq, int pos, data_t data) //修改表中元素 (按位置修改)
{
    if((pos < 0) || (pos > seq->last))  //判断插入是否合法
    {
        printf("pos error!\n");
        return;
    }
    seq->buf[pos] = data;
    return;
}

void Seqlist_Memset(SeqList *seq) //清空表
{
    memset(seq->buf, 0, sizeof(seq->buf));//从buf地址开始,将sizeof(buf)这么大的空间全部赋值为0
    seq->last = -1;
    return;
}
void Seqlist_Delete(SeqList *seq)  //删除表
{
    free(seq);
    seq = NULL;
    return;
}

void Show_Seqlist(SeqList *seq)  //打印表
{
    int i = 0;
    for(i = 0; i <= seq->last; i++)
    {
        printf("%d ", seq->buf[i]);
    }
    printf("\n");

}

五、main.c主函数代码


#include <stdio.h>
#include "seqlist.h"

int main(int argc, char *argv[])
{
    int n;
    printf("*******************************\n");
    printf("请选择对顺序表执行的操作\n");
    printf("1.创建顺序表\n2.插入元素\n3.查看顺序表是否满\n4.查看顺序表是否空\n5.修改元素\n6.清空表\n7.删除表\n8.打印表\n9.删除表中元素\n10.查找表中元素\n11.退出\n");       
    printf("*******************************\n");
    int s = 10;
    SeqList *seq = Create_Seqlist();

    while(s--)
    {
        Seqlist_Insert_Pos(seq, 0, s);
    }

    Show_Seqlist(seq);

    int pos;
    data_t data;

    while(1){
        printf("请选择功能:\n");
        scanf("%d", &n);
        getchar();

        switch (n) {
            case 1:
                printf("已创建顺序表\n");
                break;
            case 2:
                printf("请输入想要插入的位置和元素:\n");
                scanf("%d%d", &pos, &data);
                Seqlist_Insert_Pos(seq, pos, data); 
                break;
            case 3:
                if(Seqlist_Is_Full(seq) == 1){
                    printf("顺序表元素已满\n");
                }
                break;
            case 4:
                if(Seqlist_Is_Empty(seq) == 1){
                    printf("顺序表是空表\n");
                }
                break;
            case 5:
                printf("请输入想要修改元素的位置和值:\n");
                scanf("%d%d", &pos, &data);
                Seqlist_Edit_Pos(seq, pos, data);
                break;
            case 6:
                Seqlist_Memset(seq);
                break;
            case 7:
                Seqlist_Delete(seq);
                break;
            case 8:
                Show_Seqlist(seq);
                break;
            case 9:
                printf("请输入数值或者位置删除表中元素:\n");
                printf("0.数值\n1.位置\n");

                int m;
                scanf("%d", &m);
                switch (m) {
                    case 0:
                        printf("请输入数值:\n");
                        scanf("%d", &data);
                        Seqlist_Delete_Data(seq, data);
                        break;
                    case 1:
                        printf("请输入位置:\n");
                        scanf("%d", &pos);
                        Seqlist_Delete_Pos(seq, pos);
                        break;
                }
                break;
            case 10:
                printf("请输入元素的位置:\n");
                scanf("%d", &pos);
                data = SeqList_Find_Pos(seq, pos);
                printf("%d\n", data);
                break;
            case 11:
                return 0;
        }
    }

    return 0;
} 

       以上就是线性顺序表在Linux Ubuntu下的C语言实现,功能还有很多,作者只是例举了常见的一部分,欢迎大家补充,一起交流学习。

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C语言中,顺序表是一种常用的线性结构,可以用数组来实现顺序表中的数据是按照一定的顺序排列的,可以通过索引来访问和操作。 要实现输入数据到顺序表中,我们可以按照以下步骤进行: 1. 首先,定义一个顺序表的结构体,包含两个成员变量:一个是存放数据的数组,另一个是记录当前顺序表中的元素个数的变量。 ```c #define MAX_SIZE 100 // 假设顺序表最大容量为100 typedef struct { int data[MAX_SIZE]; int length; } SeqList; ``` 2. 创建一个顺序表变量并初始化。 ```c SeqList list; list.length = 0; ``` 3. 接下来,可以通过循环语句或用户输入来逐个输入数据到顺序表中。假设我们要输入n个数据。 ```c int n; printf("请输入要输入的数据个数:"); scanf("%d", &n); printf("请输入%d个数据,用空格或换行隔开:\n", n); for(int i = 0; i < n; i++) { scanf("%d", &list.data[i]); list.length++; } ``` 在这段代码中,我们通过for循环逐个读取用户输入的数据,并存放到顺序表的数组中,同时通过增加length变量的值来记录顺序表中的元素个数。 4. 输入完成后,我们可以通过循环遍历顺序表中的数据来验证是否输入成功。 ```c printf("顺序表中的数据为:\n"); for(int i = 0; i < list.length; i++) { printf("%d ", list.data[i]); } printf("\n"); ``` 以上就是用C语言实现顺序表输入数据的步骤。通过定义顺序表结构体、初始化顺序表变量、循环输入数据,我们可以方便地将数据存储到顺序表中,并进行后续操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值