线性表的概念和顺序存储结构与链式存储结构之单链表,双链表,循环单双链表

本文详细介绍了线性表这一数据结构,包括其作为数据元素序列的逻辑特性,以及两种常见的存储结构——顺序存储和链式存储。在顺序存储中,元素按顺序存储在一片连续内存空间;而在链式存储中,节点通过指针相连,分为单链表和双链表。此外,还提供了相关操作如初始化、插入、销毁等的代码实现。
摘要由CSDN通过智能技术生成

线性表

什么是线性表

1.线性表是真实世界中对具有相同特性的数据元素的有限序列的别名。每一个数据元素都有自己唯一的编号以作区分。也就是说,线性表是真实世界中描述数据对象的称呼,它包含逻辑结构和数据运算。(可以和树,图,集合等价的地位,他们都是现实生活描述数据对象的形式)

2.线性表的存储结构有顺序存储结构和链式存储结构。

线性表的顺序存储结构

1.概括:线性表的元素按照顺序(编号顺序或是其他给定的顺序)存储。存储器分配出的是一片连续的空间。

2.代码

声明定义

typedef struct
{
  ELemTYpe data[MAXV];
  int length;
}Sqlist;

初始化顺序表(注意顺序表和线性表的区分,不然后面真的可能会糊涂,顺序表是线性表的存储结构)

void InitList(Sqlist *&L)
{
  L=(Sqlist*)malloc(sizeof(Sqlist));
  int length=0;
}

销毁线性表

void DestroyList(Sqlist *&L)
{
  free(L);
}

判定是否为空

bool ListEmpty(Sqlist *&L)
{
  return(L->length==0);
}

输出线性表

void DispLIst(Sqlist *&L)
{
  if(ListEmpty(L))
    return;
  for(int i=0;i<L->length;i++)
  {
    printf("%d",L->data[i]);
    printf("\n");
  }
}

求某个元素值

void GetElem(Sqlist *&L,int i,Elemtype e)
{
  if(i<1||i>=L->length)return false;
  e=L->data[i];
  return true;
}

顺序表插入元素

void ListInsert(Sqlist *&L,int i,ElemType e)
{
  if(i<1||i>=L->length+1)return false;
  i--;
  for(int j=L->length;j>i;j--)
  L->data[j]=L->data[j-1];
  L->data[i]=e;
  L->length++;
  return true;
}

线性表的链式存储结构

1.在节点内增加一个指针域作为和其他节点连接的手段。增加一个指向后继节点的指针我们称之为单链表,再增加一个指向前驱结点的指针我们称之为双链表。最后一个节点指向后继节点的指针指向最开始的结点,则是循环链表,当然也分循环单链表和循环双链表。

2.这里增加一个知识点,存储密度=节点中数据所占的存储空间/结点所占的总空间。因此顺序表是100%,而链表因为有指针域所以小于100%。

3.代码

声明定义

typedef struct LNode
{
  Elemtype data;
  struct LNode *next;
}LinkNode;

头插法建表

void CreateListF(LinkNode *&L,Elemtype a[],int n)
{
  LinkNode *s;
  L=(LinkNode *)malloc(sizeof(LinkNode));
  L->next=NULL;
  for(int i=0;i<n;i++)
  {
    s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=a[i];
    s->next=L->next;
    L->next=s;
  }
}

尾插法建表

void CreateListR(LinkNode *&L,Elemtype a[],int n)
{
  LinkNode *s,*r;
  L=(LinkNode *)malloc(sizeof(LinkNode));
  r=L;
  for(int i=0;i<n;i++)
  {
    s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=a[i];
    r->next=s;
    r=s;
  }
  r->next=NULL;
}

销毁表

void DestroyList(LinkNode *&L)
{
  LinkNode *pre,*p;
  pre=L;
  p=L->next;
  while(p!=NULL)
  {
    free(pre);
    pre=p;
    p=p->next;
  }
  free(pre);
}

插入数据元素

bool ListInsert(LinkNode *&L,int i,Elemtype e)
{
  int j=0;
  LinkNode *p=L,*s;
  while(j<i-1&&p!=NULL)
  {
    j++:
    p=p->next;
  }
  if(p==NULL)return false;
  else
  {
    s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
  }
}

双链表换汤不换药,举一反三。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱总结的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值