数据结构笔记:线性表顺序存储结构(C语言)

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

这里用C语言的一位数组来实现顺序存储结构。

·

线性表的数据对象集合为{a1,a2,a3......an},每个元素的类型均为一样的。其实,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个后继元素。数据元素之间的关系是一对一的关系。

Operation

InitList(*L);  初始化操作

ListEmpty(L);若线性表为空,返回true,否则返回false

ClearList(*L);将线性表清空

GetElem(L,i,*e);将线性表L中的第i个位置元素值返回给e

LocateElem(L,e);在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败

ListInsert(*L,i,e);在线性表L中的第i个位置插入新元素e

ListDelete(*L,i,*e);删除线性表L中的第i个元素,并用e返回其值

OutputList(L);输出线性表的内容


具体代码如下:

#include <stdio.h>

#define MAXSIZE 50
int i;

typedef struct//定义顺序存储结构体
{
    char data[MAXSIZE];
    int length;
}List;

void InitList(List *P)//初始化空表
{
    int n;
    for(i=0;i<P->length;i++)//初始化所有内容为\0
        P->data[i] = '\0';
    P->length = 0;
    printf("请输入存入字符的个数:");
    scanf("%d",&n);
    getchar();//接收一个字符防止回车对内容的影响
    printf("请输入内容:");
    for(i=0;i<n;i++)
    {
        scanf("%c",&P->data[i]);
        P->length++;
    }
    printf("存入完毕!\n\n");
}

int ListEmpty(List L)//空表返回0,非空表返回1
{
    if(L.length == 0)//空表
        return 0;
    else
        return 1;
}

void ClearList(List *P)//清空线性表
{
    for(i=0;i<P->length;i++)
        P->data[i] = '\0';
    P->length=0;
    printf("线性表已清空!\n\n");
}

char GetElem(List L,int x,char e)//得到第x个位置的元素并赋值给e返回
{
    if(x<1 || x>L.length)//查找的位置超出范围
    {
        printf("位置异常!\n\n");
        return 0;
    }
    else
    {
        e = L.data[x-1];
        return e;
    }
}

int LocateElem(List L,char e)
{
    for(i=0;i<L.length;i++)//查找e的位置
        if(L.data[i] == e)
            return i+1;
    return 0;
}

int ListInsert(List *P,int x,char e)//删除位置x上的数据,成功返回1,失败返回0
{
    printf("在第%d个位置插入%c\n",x,e);
    if(P->length == MAXSIZE)//表满了
    {
        printf("线性表已满,插入失败!\n");
        return 0;
    }
    if(x<1 || x>P->length+1)//超出范围,超出最后一位异常才是异常
    {
        printf("插入位置异常,插入失败!\n");
        return 0;
    }
    if(x <= P->length)//插入位置不再尾部
    {
        for(i=P->length-1;i>=x-1;i--)
            P->data[i+1] = P->data[i];
        P->data[x-1] = e;
        P->length++;
        printf("插入成功!\n");
        return 1;
    }
    if(x == P->length+1)//插入位置在尾部
    {
        P->data[x] = e;
        P->length++;
        printf("插入成功!\n\n");
        return 1;
    }
}

char ListDelete(List *P,int x,char e)//删除位置x上的数据,成功返回e,失败返回0
{
    printf("删除第%d位置上的数据\n",x);
    if(P->length == 0)//空表
    {
        printf("线性表为空表,删除失败!\n");
        return 0;
    }
    if(x<1 || x>P->length)//范围异常
    {
        printf("删除位置异常,删除失败!\n");
        return 0;
    }
    if(x < P->length)//删除位置不是尾部
    {
        e = P->data[x-1];
        for(i=x;i<P->length;i++)
            P->data[i-1] = P->data[i];
        P->data[P->length-1] = '\0';
        P->length--;
        printf("删除成功!\n");
        return e;
    }
    if(x == P->length)//删除位置在尾部
    {
        e = P->data[x-1];
        P->data[x-1] = '\0';
        P->length--;
        printf("删除成功!\n\n");
        return e;
    }
}

void OutputList(List L)//输出线性表中内容
{
    if(L.length == 0)
        printf("线性表中没有内容,为空表!");
    else
    {
         printf("线性表内容如下:\n");
        for(i=0;i<L.length;i++)
            printf("%c",L.data[i]);
        printf("\n\n");
    }
}

int main()
{
    List L;

    InitList(&L);//测试初始化

    if(ListEmpty(L))
        printf("线性表非空!\n\n");
    else printf("线性表为空!\n\n");

    OutputList(L);

    char E;
    printf("请输入查找的位置:");//测试按位置查找
    scanf("%d",&i);
    E = GetElem(L,i,E);
    if(E != 0)
        printf("第%d个位置上是:%c\n\n",i,E);

    printf("请输入要查找的元素:");//测试按元素查找
    getchar();
    scanf("%c",&E);
    i = LocateElem(L,E);
    if(i)
        printf("%c在线性表中的位置是:%d\n\n",E,i);
    else printf("没有在线性表中找到%c\n\n",E);

    printf("请输入插入字符:");//测试插入
    getchar();
    scanf("%c",&E);
    printf("请输入插入的位置:");
    scanf("%d",&i);
    ListInsert(&L,i,E);
    OutputList(L);

    int j;
    printf("请输入删除的元素位置:");//测试删除
    scanf("%d",&j);
    E = ListDelete(&L,j,E);
    if(E != 0)
        printf("线性表第%d个位置的%c已删除!\n\n",j,E);
    OutputList(L);

    ClearList(&L);//测试清空
    if(ListEmpty(L))
        printf("线性表非空!\n\n");
    else printf("线性表为空!\n\n");
    OutputList(L);
    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值