数据结构之顺序表

本文详细介绍了顺序表的概念,通过动态分配数组存储线性表,并提供了顺序表的初始化、插入、删除、修改和查找等操作的C语言实现。通过示例代码展示了如何在顺序表中进行常见操作,帮助理解顺序表的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。

      构造一个顺序表的过程

 

1.为线性表动态分配一组存储结构

 #define list_init_size 100  //在这里设置线性表长度可以方便以后的修改 ,后续操作时,只要在这里改动,就可以修改整个顺序摆                                                         的长度
#define listincrement 10
#define ok 1                     //
#define overflow -1
#define error 0

typedef int status;

//线性表的动态分配线性存储结构 
typedef struct {
    int *elem;   //存储空间基址       //这里的数据类型不仅是int,可以改为float,char等,  elem是一个指针变量,可以指向一个数,                           也 可以指向一个数组
    int length;  //当前长度
    int listsize; //当前分配的存储容量 
}sqlist;                   //sqlist此时就是一个新的数据类型标识符,类似于int,后面可以用它来声明一个顺序表

                                    如要声明一个名叫l的顺序表,可以用语句sqlist  l;

2.初始化顺序表

//构造一个空的线性表L 
status initlist_sq(sqlist &l)
{
    l.elem=(int *)malloc(list_init_size*sizeof(int));   //  分配一段长为4*100字节的连续的存储空间  
    if(!l.elem)                 
    {     
        printf("线性表构造失败!\n");
        exit(overflow);   //存储分配失败 
    } 
    l.length=0;       //添加数据之前,顺序表的长度记为0
    l.listsize=list_init_size;           //最大长度暂时设置为100,需要更改时可以在头文件中修改
    printf("线性表构造成功!\n");
    return ok;
}       

3. //给顺序表插入元素
status listinsert_sq(sqlist &l,int i,int e)  // 在第i位插入元素e
{
    int *newbase,*p,*q;   //临时变量 
    if((i<1)||(i>l.length+1)) 
    {
        printf("您输入的数据有误,请重新输入!\n");
        return error;        //i值非法
   }
    if(l.length>=l.listsize)
    {
        newbase = (int *)realloc(l.elem,(l.listsize+listincrement)*sizeof(int));    //由于要插入数据,所以要重新为线性表分配存储空间
        if(!newbase)  exit(overflow);
        l.elem=newbase;
        l.listsize+=listincrement;
    }
    q=&(l.elem[i-1]);    //q为插入位置
    for(p=&(l.elem[l.length-1]);p>=q;--p)    //插入位置及以后的元素后移
         *(p+1)=*p;           
    *q=e;             //插入e
    ++l.length;   //插入一个数据后长度要+1
    return ok;

4.//删除元素
status listdelete(sqlist &l,int i,int &e)
//在顺序表L删除第i个元素,并用e返回其值 
{
    int *p,*q;
    //i的合法值为1<=i<=listlength
    if((i<1)||(i>l.length)) 
    //{
    //    printf("您输入的数据有误,请重新输入!\n");
        return error;        //i值非法
   // }
    p=&(l.elem[i-1]);    //p为被删除元素的位置 
    e=*p;                //被删除元素的值赋给e 
    q=l.elem+l.length-1; //表尾元素的位置 
    for(++p;p<=q;++p)*(p-1)=*p;       //被删除元素之后的元素左移
    --l.length;
    return ok;   

5.//改变线性表中某元素的值 
status listmodify(sqlist &l,int i,int e)
{
    //把顺序表中第i个元素的值改为e
    if((i<1)||(i>l.length)) 
    {
        printf("您输入的数据有误,请重新输入!\n");
        return error;        //i值非法
    }
    l.elem[i-1]=e;
    return ok;

6.//查找线性表中的值
status listsearch(sqlist &l,int num,int e)
{
    int i;
    //查找线性表中值为c的元素,将其序号返回给num 
    for(i=0;i<l.length;i++)
        if(l.elem[i]==e)  
        {
            num=i+1;
            printf("%d是线性表的第%d个元素\n",e,num);
            return ok;
        }
    if(i==l.length)
    {
        printf("线性表中不存在元素%d\n",e);
        return ok;
    }

 7.在主函数中调用上述函数

int main()
{
    int c,b;
    sqlist l;
    initlist_sq(l);
    for(int i=1;i<20;i++)
        listinsert_sq(l,i,i-1);
    listmodify(l,6,18);
    listdelete(l,5,c);
    listsearch(l,b,10); 
    printf("您删除了顺序表中的第5个元素:%d\n",c);
    printf("表中剩余元素为\n");
    for(int i=0;i<18;i++)
        printf("%d ",l.elem[i]);
    printf("\n");    
    return 0;

 

 

附录:完整代码

#include<stdio.h>
#include<stdlib.h>
#define list_init_size 100  //在这里设置线性表长度可以方便以后的修改 
#define listincrement 10
#define ok 1
#define overflow -1
#define error 0
typedef int status;

//线性表的动态分配线性存储结构 
typedef struct {
    int *elem;   //存储空间基址
    int length;  //当前长度
    int listsize; //当前分配的存储容量 
}sqlist;

//构造一个空的线性表L 
status initlist_sq(sqlist &l)
{
    l.elem=(int *)malloc(list_init_size*sizeof(int)); //    
    if(!l.elem)   
    {     
        printf("线性表构造失败!\n");
        exit(overflow);   //存储分配失败 
    } 
    l.length=0;
    l.listsize=list_init_size;
    printf("线性表构造成功!\n");
    return ok;
}

//插入元素
status listinsert_sq(sqlist &l,int i,int e)  // 
{
    int *newbase,*p,*q;   //临时变量 
    if((i<1)||(i>l.length+1)) 
    {
        printf("您输入的数据有误,请重新输入!\n");
        return error;        //i值非法
   }
    if(l.length>=l.listsize)
    {
        newbase = (int *)realloc(l.elem,(l.listsize+listincrement)*sizeof(int));
        if(!newbase)  exit(overflow);
        l.elem=newbase;
        l.listsize+=listincrement;
    }
    q=&(l.elem[i-1]);
    for(p=&(l.elem[l.length-1]);p>=q;--p)
        *(p+1)=*p;
    *q=e;
    ++l.length;
    return ok;

 
//删除元素
status listdelete(sqlist &l,int i,int &e)
//在顺序表L删除第i个元素,并用e返回其值 
{
    int *p,*q;
    //i的合法值为1<=i<=listlength
    if((i<1)||(i>l.length)) 
    //{
    //    printf("您输入的数据有误,请重新输入!\n");
        return error;        //i值非法
   // }
    p=&(l.elem[i-1]);    //p为被删除元素的位置 
    e=*p;                //被删除元素的值赋给e 
    q=l.elem+l.length-1; //表尾元素的位置 
    for(++p;p<=q;++p)*(p-1)=*p;       //被删除元素之后的元素左移
    --l.length;
    return ok;   

//改变线性表中某元素的值 
status listmodify(sqlist &l,int i,int e)
{
    //把顺序表中第i个元素的值改为e
    if((i<1)||(i>l.length)) 
    {
        printf("您输入的数据有误,请重新输入!\n");
        return error;        //i值非法
    }
    l.elem[i-1]=e;
    return ok;

//查找线性表中的值
status listsearch(sqlist &l,int num,int e)
{
    int i;
    //查找线性表中值为c的元素,将其序号返回给num 
    for(i=0;i<l.length;i++)
        if(l.elem[i]==e)  
        {
            num=i+1;
            printf("%d是线性表的第%d个元素\n",e,num);
            return ok;
        }
    if(i==l.length)
    {
        printf("线性表中不存在元素%d\n",e);
        return ok;
    }

int main()
{
    int c,b;
    sqlist l;
    initlist_sq(l);
    for(int i=1;i<20;i++)
        listinsert_sq(l,i,i-1);
    listmodify(l,6,18);
    listdelete(l,5,c);
    listsearch(l,b,10); 
    printf("您删除了顺序表中的第5个元素:%d\n",c);
    printf("表中剩余元素为\n");
    for(int i=0;i<18;i++)
        printf("%d ",l.elem[i]);
    printf("\n");
    
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值