欢迎投稿

今日深度:

线性表,线性表有哪些

线性表,线性表有哪些


       下个月就要自考了,这几天在做数据结构导论的题。发现这本书一共就两部分,分别是存储结构(表、树、图)和对数据的操作(查找、排序)。今天想说说线性表的两种存储结构(顺序存储和链式存储)。


       顺序存储顾名思义就是将表中的节点依次放在计算机内存中一组连续的存储单元中,数据元素在线性表中的邻接关系决定它们在存储空间中的存储位置,即逻辑结构中相邻的节点期存储位置也相邻,一般使用数组来表示顺序表。

       顺序存储是最简单最原始的一种存储方式,因为是数组需预先定义,所以会浪费一些空间,第i个数据元素存放在数组下标为“I-1”的位置。它的基本运算为插入、删除、定位。

       插入对应的题型一般是:在表长为N的表上的第M个元素前插入,需要移动元素的个数为N-M+1

       删除对应的题型:把表长为N的表上的第M个元素删除,则M以后的元素向左移动,表长减1

       定位对应的题型:一般与时间复杂度联系,我们可以想象定位必定是一个一个依次查找,所以要用到一次循环,在表长为N的表上定位时间复杂度就为O(N)。


       链式存储常见的有单链表、循环链表、双向循环链表。加入了指针,指向下一数据元素,尾节点指针为Null空指针,如果头指针指向尾指针则为空单链表。循环链表的最后一个节点的指针指向第一个结点。双向循环链表加入了一个指向前驱结点的指针prior。

       需要注意的是插入运算,单链表需要用一个指针指向待删结点的前驱结点。在双循环链表中,可直接删除。


       在比较两种方式的时候,一般比较它们的时间复杂度,这也是经常出题的点。按位置查找运算时,顺序表是随机的,时间复杂度是O(1),单链表需要扫描用到循环,所以为O(N)。定位运算时,都要扫描用到循环,所以时间复杂度都为O(N)。插入、删除运算时,都需要定位,所以时间复杂度都为O(N)。






线性表的基本操作c语言实现

#include"stdio.h"
#include<malloc.h>

typedef char ElemType;

typedef struct LNode
{ElemType data;
struct LNode *next;
}LinkList;

void CreatListF(LinkList *&L,ElemType a[],int n) //头插法建表
{
LinkList *s;int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}

void CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建表
{
LinkList *s,*r;int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}

void InitList(LinkList *&L) //初始化线性表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}

void DestroyList(LinkList *&L) //销毁线性表
{
LinkList *p=L,*q=p->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}

int ListEmpty(LinkList *L) //判断线性表是否为空
{
return(L->next==NULL);
}

int ListLength(LinkList *L) //求线性表的长度
{
LinkList *p=L;int n=0;
while(p->next!=NULL)
{
n++;p=p->next;
}
return(n);
}

void DispList(LinkList *L) //输出线性表
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
}

int GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素值
{
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)
retu......余下全文>>
 

线性表的基本操作c语言实现

#include"stdio.h"
#include<malloc.h>

typedef char ElemType;

typedef struct LNode
{ElemType data;
struct LNode *next;
}LinkList;

void CreatListF(LinkList *&L,ElemType a[],int n) //头插法建表
{
LinkList *s;int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}

void CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建表
{
LinkList *s,*r;int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}

void InitList(LinkList *&L) //初始化线性表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}

void DestroyList(LinkList *&L) //销毁线性表
{
LinkList *p=L,*q=p->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}

int ListEmpty(LinkList *L) //判断线性表是否为空
{
return(L->next==NULL);
}

int ListLength(LinkList *L) //求线性表的长度
{
LinkList *p=L;int n=0;
while(p->next!=NULL)
{
n++;p=p->next;
}
return(n);
}

void DispList(LinkList *L) //输出线性表
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
}

int GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素值
{
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)
retu......余下全文>>
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3601.html NewsArticle 线性表,线性表有哪些 下个月就要自考了,这几天在做数据结构导论的题。发现这本书一共就两部分,分别是存储结构(表、树、图)和对数据的操作(查找、排序)。今天想说说线性...
评论暂时关闭