线性表之顺序存储

线性结构的特点:

表头元素没有前驱,表尾元素没有后继,中间元素有唯一前驱和唯一后继。

 利用数组也是顺序存储的特点,所以可以用数组实现线性表的顺序存储。

        线性表的顺序存储以下称之为顺序表,表中每个元素的地址间是连续存储的,所以可以由数组下标依次访问每个元素,即设计一个包含存储数据的数组和一个表尾指针。

        因为是采用数组实现,而数组元素能通过下标访问,所以表尾指针不用定义成指针类型,而是一个整型变量即可,表尾指针的作用是来指明表内当前存储的有效数据个数,便于对表的判断空表、判断表满、添加数据、删除数据等操作。

所以整张表可由一个结构体表示

#define N 100

typedef int data_t  //可以改为任意类型的数据进行存储,本文设为存储int型数据

typedef struct seqlist{

data_t buf[N]; //定义表的大小

int last; //定义表尾指针

}SeqList;

头文件:

/*===============================================
*   文件名称:seqlist.h
*   创 建 者:  xm   
*   创建日期:2022年07月27日
*   描    述::
================================================*/
#ifndef _SEQLIST_
#define _SEQLIST_
#include <stdlib.h>
#define N 64
typedef int data_t;

typedef struct{
    data_t buf[N];//定义表长
    int last;//定义表尾指针
}SeqList;

SeqList *Create_Seqlist();//创建表
int SeqList_Length(SeqList *seq);//求表长
void SeqList_Insert_Pos(SeqList *seq,int pos,int data);//插入表
void Show_SeqList(SeqList *seq);//打印表
int SeqList_Is_Full(SeqList *seq);//判满
int SeqList_is_Empty(SeqList *seq);//判空
void SeqList_Delete_Pos(SeqList *seq,int pos);//按位置删除
void SeqList_Delete_Val(SeqList *seq,int value);//按值>删除
int SeqList_Find_Pos(SeqList *seq,int pos);//按位置查找
int SeqList_Find_Val(SeqList *seq,int value);//按值查找
void SeqList_Empty_List(SeqList *seq);//清空表
void SeqList_change(SeqList *seq,int pos,int value);//按位置修改




#endif

功能函数文件:

/*===============================================
*   文件名称:line_list.c
*   创 建 者: xm    
*   创建日期:2022年07月27日
*   描    述:
================================================*/
#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
#include <string.h>
//创建表
SeqList *Create_Seqlist()
{
    SeqList *seq = (SeqList *)malloc(sizeof(SeqList));
    if(seq == NULL){//申请空间失败
        printf("malloc ERROR!\n");
        return NULL;
    }

    //初始化数组内容
    //从 首地址 开始, sizeof() 个字节全部置 0
    memset(seq->buf,0,sizeof(seq->buf));
    seq->last = -1; //表尾指针初始化
    return seq;

}
int SeqList_Is_Full(SeqList *seq)
{
    if(seq->last ==N-1)return 1;//表满返回1
    else return 0;
}
int SeqList_is_Empty(SeqList *seq)
{
    if(seq->last==-1)return 0;//表空返回0
    else return 1;
}
int SeqList_Length(SeqList *seq)//求表长
{
    return seq->last;
}
void SeqList_Insert_Pos(SeqList *seq,int pos,int data)//插入
{
    if(seq->last != -1)//避免空表时插入出错
    {
        if(pos<0 || (pos > seq->last))
        {
            printf("位置错误\n");
            return;
        }
    }
    if(SeqList_Is_Full(seq)==1)//判满
    {
        printf("表满\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++;
}
void Show_SeqList(SeqList *seq)//打印表
{
    int i;
    if(SeqList_is_Empty(seq)==0)
    {
        printf("表为空\n");
        return ;
    }
    for(i=0;i<=seq->last;i++)
    {
        printf("buf[%d]=%d\n",i,seq->buf[i]);
    }
    puts("");
}

void SeqList_Delete_Pos(SeqList *seq,int pos)//按位置删除
{
   if(SeqList_is_Empty(seq)==0)
   {
       printf("表为空,无法删除\n");
       return;
   }
    if(pos<0 || pos>seq->last)
    {
        printf("位置错误\n");
        return;
    }
    int i;
    for(i=pos;i<seq->last;i++)
    {
        seq->buf[i]=seq->buf[i+1];
    }
    seq->buf[i]=0;
    seq->last--;
}
void SeqList_Delete_Val(SeqList *seq,int value)//按值>删除
{
    if(SeqList_is_Empty(seq)==0)
    {
        printf("表为空,无法删除\n");
        return;
    }
    int i,j;
    for(i=0;i<=seq->last;i++)
    {
        if(seq->buf[i]==value)
        {
            for(j=i;j<(seq->last);j++)
            {
                seq->buf[j]=seq->buf[j+1];
            }
            seq->buf[j]=0;
            seq->last--;
            i--;
        }
    }

}
int SeqList_Find_Pos(SeqList *seq,int pos)//按位置查找
{
    if(SeqList_is_Empty(seq)==0)
    {    
        printf("表为空\n");
        return -1;
    }
    if(pos<0 || pos>seq->last)
    {
        printf("位置错误\n");
        return -1;
    }
    return seq->buf[pos];
}
int SeqList_Find_Val(SeqList *seq,int value)//按值查找
{
    if(SeqList_is_Empty(seq)==0)
    {
        printf("表为空\n");
        return -1;
    }
    int i=0;
    while(seq->buf[i]!=value)i++;
    return i;

}
void SeqList_change(SeqList *seq,int pos,int value)//按位置修改
{
    if(SeqList_is_Empty(seq)==0)
    {    
        printf("表为空\n");
        return ;
    }
    if(pos<0 || pos>seq->last)
    {
        printf("位置错误\n");
        return ;
    }
    seq->buf[pos]=value;
}
void SeqList_Empty_List(SeqList *seq)//清空表
{
    seq->last=-1;
}

主函数文件:

/*===============================================
*   文件名称:main.c
*   创 建 者:     
*   创建日期:2022年07月27日
*   描    述:
================================================*/
#include <stdio.h>
#include "seqlist.h"
int main(int argc, char *argv[])
{ 
/*    int n=10;
    while(n--)//头插法
    {
    SeqList_Insert_Pos(seq,0,n);
    }
    Show_SeqList(seq);//打印表
*/
    SeqList *seq;
    int mode=0,pos=-1,data=-1;
    while(1)
    {
        printf("-----------功能列表-----------\n");
        printf("1.创建表 2.插入数据 3.打印表 4.按位置删除数据 5.按数据值删除\n 6.按位置查找数据 7.按值查找 8.按位置修改数据 9.清空表 10.退出程序\n");
    
    scanf("%d",&mode);
    getchar();
    switch(mode)
    {
        case 1:seq=Create_Seqlist();puts("创建成功");
               break;
        case 2:puts("输入要插入的位置和数据");
               scanf("%d%d",&pos,&data);
               printf("pos=%d,data=%d\n",pos,data);
               SeqList_Insert_Pos(seq,pos,data);
               break;
        case 3:Show_SeqList(seq);
               break;
        case 4:puts("输入要删除的位置");
               scanf("%d",&pos);
               printf("pos=%d,data=%d\n",pos,data);
               SeqList_Delete_Pos(seq,pos);
               break;
        case 5:puts("输入要删除的数据值");
               scanf("%d",&data);
               printf("pos=%d,data=%d\n",pos,data);
               SeqList_Delete_Val(seq,data);
               break;
        case 6:puts("输入要查找的位置");
               scanf("%d",&pos);
               printf("pos=%d,data=%d\n",pos,data);
               printf("buf[%d]=%d\n",pos,SeqList_Find_Pos(seq,pos));
               break;
        case 7:puts("输入要查找的数据值");
               scanf("%d",&data);
               printf("pos=%d,data=%d\n",pos,data);
               printf("buf[%d]=%d\n",SeqList_Find_Val(seq,data),data);
               break;
        case 8:puts("输入要修改的位置以及新数据");
               scanf("%d%d",&pos,&data);
               printf("pos=%d,data=%d\n",pos,data);
                SeqList_change(seq,pos,data);
               printf("修改后buf[%d]=%d\n",pos,seq->buf[pos]);
               break;
        case 9:SeqList_Empty_List(seq);
               printf("清空表完成");
               break;
        case 10:return 0;
        default:
               puts("输入错误\n");
    }
    }
    free(seq);
    seq=NULL;
    return 0;
} 

顺序表

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

缺点:浪费资源空间,插入和删除数据效率低,且不能适应动态变化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值