线性表—顺序结构

线性表的基本内容

特点:1、存在唯一一个被叫做第一个的元素。
2、存在唯一一个被叫做最后一个的元素。
3、除第一个元素外,其它元素都有且只有一个直接前驱。
4、除最后一个元素外,其它元素都有且只有一个直接后继。

a、线性表的一个数据元素可以由若干个数据项组成。
b、同一线性表中的数据元素必须具有相同的特性,即属于同一数据对象。

顺序结构的基本内容

概念:线性表的顺序表示是指用一组地址连续的存储单元依次存储线性表中的数据元素。
线性表的这个机内表示称作线性表的顺序存储结构或顺序映像。
特点:表中相邻的两个元素在屋里位置上也相邻。
因为线性表的元素的位置与其第一个元素的位置线性相关,因此只要确定了线性表第一个元素的位置,就可以随机存取线性表中的任一元素,故顺序存储结构是一种随机存取的存储结构。

顺序表基本功能的实现

#include<stdio.h>
#include<stdlib.h>

#define INIT_LISTSIZE 10
#define INCREMENT_SIZE 5

typedef struct{
    int *elem;
    int length;
    int listsize;
}SqList;

void Prior_Elem(SqList L,int k,int &e);
void Next_Elem(SqList L,int k,int &e);
int Locate_Elem(SqList L,int i);
void Get_Elem(SqList L,int i,int &e);
void List_Length(SqList L);
void List_Empty(SqList L);
void Init_List(SqList &L);
void List_Delete(SqList &L,int i,int &e);
void List_Insert(SqList &L,int i,int e);
void Clear_List(SqList &L);
int main()
{
    //声明一个结构体类型的顺序表
    SqList l;
    //创建一个顺序表
    Init_List(l);
    //顺序表判空
    List_Empty(l);

    //向表中存入5个数据元素
    for(int i=0;i<5;i++)
    {
        l.elem[i]=i+10;
        l.length++;
    }

    //顺序表中共有多少个元素
    List_Length(l);
    //表中的一个特定位置的元素是多少
    int e;
    Get_Elem(l,3,e);
    printf("第三位元素的值是:%d\n",e);
    //与某数比较,若线性表中有这个数则返回它的位置
    //若线性表中没有这个数则返回0
    e=Locate_Elem(l,13);
    if(!e)
    {
        printf("这个数在线性表中不存在\n");
    }
    else
    {
        printf("这个数在线性表中的位置是%d\n",e);
    }

    //找一个元素后面的那个元素
    //若那个元素为最后一个则打印“当前那个元
    //素已为最后一个元素”
    while(1)
    {//当j为0时就输入结束
        printf("请输入您要查询的元素:");
        int j;
        scanf("%d",&j);
        Next_Elem(l,j,e);
        if(e==100)
        {
            printf("%d已为最后一个元素\n",j);
        }
        else
        {
            printf("%d的后面那个元素是%d\n",j,e);
        }
        if(j==0)
        {
            printf("此次输入已经结束\n");
             break;
        }

    }

    //寻找一个元素前面的那个元素
    while(1)
    {//当j为0时就输入结束
        int k;
        printf("请输入您要查询的元素:");
        scanf("%d",&k);
        Prior_Elem(l,k,e);
        if(e==100)
        {
            printf("%d已为第一个元素\n",k);
        }
        else
        {
            printf("%d的后面那个元素是%d\n",k,e);
        }
        if(k==0)
        {
            printf("此次输入已经结束\n");
             break;
        }

    }
    //向顺序表中插入一个元素
    List_Insert(l,3,50);
    //打印顺序表中的元素
    //打印表的目的是为了看插入是否成功
    for(int i=0;i<l.length;i++)
    {
        printf("%d  ",l.elem[i]);
    }
    printf("\n");

    //删除顺序表中的一个元素,并且打印出它的值
    List_Delete(l,2,e);
    if(e==0)
    {
        printf("删除发生错误");
    }
    else
    {
        printf("删除的那个值为:%d\n",e);
    }
    //打印顺序表中的元素
    //打印表的目的是看删除是否成功

      for(int i=0;i<l.length;i++)
    {
        printf("%d  ",l.elem[i]);
    }
    printf("\n");
    //清空顺序表
    Clear_List(l);
    return 0;
}
void Clear_List(SqList &L)
{
    L.length=0;
}
void List_Delete(SqList &L,int i,int &e)
{
    if(i<=0||i>L.length)
        e=0;
    else
    {
        e=L.elem[i-1];
        int *last,*p;
        p=&L.elem[i-1];
        last=L.elem+L.length-1;
        for(p;p<last-1;p++)
        {
            *p=*(p+1);
        }
    }
}
void List_Insert(SqList &L,int i,int e)
{
     int *newbase;
    if(i<=0||i>L.length+1)
        printf("元素插入错误");
    else
    {
        if(L.length>=L.listsize)
        {
            newbase=(int *)realloc(L.elem,(INIT_LISTSIZE+INCREMENT_SIZE)*sizeof(int));
            L.elem=newbase;
            L.listsize+=INCREMENT_SIZE;
        }
        int *p=L.elem+L.length;
        int *q=&L.elem[i-1];
        for(p;p>q;p--)
        {
            *(p)=*(p-1);
        }
        *q=e;
        L.length++;
    }
}
void Prior_Elem(SqList L,int k,int &e)
{
    e=100;
    for(int i=1;i<L.length;i++)
    {
        if(L.elem[i]==k)
        {
            e=L.elem[i-1];
            break;
        }
    }
}
void Next_Elem(SqList L,int k,int &e)
{
    e=100;
    for(int i=0;i<L.length-1;i++)
    {
        if(L.elem[i]==k)
        {
            e=L.elem[i+1];
            break;
        }
    }
}
int Locate_Elem(SqList L,int i)
{
    int flag=0;
    for(int j=0;j<L.length;j++)
    {
        if(L.elem[j]==i)
        {

            flag=1;
            break;
            return j+1;
        }
    }
    if(flag==0)
    {
          return 0;
    }
}
void Get_Elem(SqList L,int i,int &e)
{
    e=L.elem[i-1];
}
void List_Length(SqList L)
{
    printf("表的长度为:%d",L.length);
}
void List_Empty(SqList L)
{
    if(L.length==0)
       {
            printf("不为空\n");
       }
    else
        {
            printf("为空\n");
        }
}

void Init_List(SqList &L)
{
    L.elem=(int *)malloc(INIT_LISTSIZE*sizeof(int));
    if(!L.elem)
        exit(-1);
    L.length=0;
    L.listsize=INIT_LISTSIZE;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值