c语言数据结构(一)----线性表的顺序存储结构及运算实现

线性表的特点:

  • 除第一个元素外,其他每一个元素有且仅有一个直接前驱。
  • 除最后一个元素外,其他每一个元素有且仅有一个直接后继。

这里我刚刚犯了一个小糊涂,线性表是线性结构,为逻辑结构,而实现其顺序存储结构又是一种物理结构,突然一下整蒙了,思考后发现逻辑结构与物理结构并不矛盾,也并非不能共存。逻辑结构是一种理论上的结构,而实现需要通过真实的物理结构表现出来。

今天要学习的是线性表中的顺序表:
顺序表可以用数组实现

/*头文件及宏定义*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
/*定义顺序表和指向顺序表的指针*/
typedef struct
{
    int data[MAXSIZE];  //存储顺序表中的元素
    int len;            //顺序表的长度
}SeqList;               //顺序表类型

顺序表的初始化函数

SeqList *Init_SeqList()
{
    SeqList *L;
    L=(SeqList*)malloc(sizeof(SeqList));
    L->len=0;
    return L;
}

建立顺序表

void CreatList(SeqList *L)
{
    int i,n;
    printf("请输入顺序表的长度:");
    scanf("%d",&n);
    printf("请依次输入顺序表元素:");
    for(i=1;i<=n;i++)
        scanf("%d",&L->data[i]);
    L->len=n;
    /*for(i=1;i<=n;i++)			//检验输出
        printf("%d ",L->data[i]);*/	
}

插入运算
在第i个位置插入值为x的元素,首先考虑

  • i之后的元素序号全要加一,且顺序表总长度加一,为实现此功能,表长n的顺序表的len改为n+1即可,并且从data[n]赋值给data[n+1],以此类推至data[i]为x。

其次需要考虑的是

  • 插入的时候顺序表最大长度是否已满,即L->len=MAXSIZE
  • i是否为有效值,即i<1或i>=MAXSIZE
void Inser_SeqList(SeqList *L,int i,int x)  //i为插入的序号,x为插入的元素大小
{
    int j;
    if(L->len==MAXSIZE-1)                     //判断顺序表是否已满
        printf("顺序表已满,请找一个大一点的顺序表");
    else
        if(i<1||i>L->len)                   //判断插入位置的正确性
            printf("插入的位置不对哦");
        else
        {
            for(j=L->len;j>=i;j--)          //将data[n+1]至data[i]重新赋值
                L->data[j+1]=L->data[j];
            L->data[i]=x;
            L->len++;
        }
}
/*验证*/
int main()
{
    SeqList *L;
    L=Init_SeqList();
    CreatList(L);
    int i,x;
    printf("请输入要插入的位置:");
    scanf("%d",&i);
    printf("请输入数值:");
    scanf("%d",&x);
    Inser_SeqList(L,i,x);
    for(i=1;i<=L->len;i++)
        printf("%d ",L->data[i]);
    return 0;
}

结果:
验证插入函数
删除运输
删除运算是将第i个元素从表中去除

  • 表长n将变为n-1,且data[i]到data[n]需要前移
  • L->len不能为0(不然咋删除呢)
  • i<1或i>=MAXSIZE插入位置非法
void Delete_SeqList(SeqList *L,int i)
{
    int j;
    if(L->len==0)
        printf("表不能为空时删除");
    else
        if(i<1||i>=MAXSIZE)
            printf("插入的位置不对哦");
        else
        {
            for(j=i;j<L->len;j++)
                L->data[j]=L->data[j+1];
            L->len--;
        }
}
int main()
{
    SeqList *L;
    L=Init_SeqList();
    CreatList(L);
    int i;
    printf("请输入要删除的位置:");
    scanf("%d",&i);
    Delete_SeqList(L,i);
    for(i=1;i<=L->len;i++)
        printf("%d ",L->data[i]);
    return 0;
}

结果:
验证删除函数
查找运算
查找顺序表中与给定值x相等的元素

int Locaton_SeqList(SeqList *L,int x)
{
    int i=L->len;
    L->data[0]=x;
    while(L->data[i]!=x)
        i--;
    return i;
}
int main()
{
    SeqList *L;
    L=Init_SeqList();
    CreatList(L);
    int i,x;
    printf("请输入要查找的元素:");
    scanf("%d",&x);
      i=Locaton_SeqList(L,x);
    if(i!=0)
        printf("查找到的元素位置为:%d",i);
    else
        print("未查找此值");
    return 0;
}

结果:
验证查找函数
综上,便是顺序表的代码实现,通过数组实现,判断位置以及表长决定是否可以对顺序表进行插入、删除、查找等操作。

发布了3 篇原创文章 · 获赞 1 · 访问量 128

猜你喜欢

转载自blog.csdn.net/qq_45704650/article/details/104325809