線性表,線性表有哪些

來源:互聯網
上載者:User

線性表,線性表有哪些

       下個月就要自考了,這幾天在做資料結構導論的題。發現這本書一共就兩部分,分別是儲存結構(表、樹、圖)和對資料的操作(尋找、排序)。今天想說說線性表的兩種儲存結構(順序儲存和鏈式儲存)。


       順序儲存顧名思義就是將表中的節點依次放在電腦記憶體中一組連續的儲存單元中,資料元素線上性表中的鄰接關係決定它們在儲存空間中的儲存位置,即邏輯結構中相鄰的節點期儲存位置也相鄰,一般使用數組來表示順序表。

       順序儲存是最簡單最原始的一種儲存方式,因為是數組需預先定義,所以會浪費一些空間,第i個資料元素存放在數組下標為“I-1”的位置。它的基本運算為插入、刪除、定位。

       插入對應的題型一般是:在表長為N的表上的第M個元素前插入,需要移動元素的個數為N-M+1

       刪除對應的題型:把表長為N的表上的第M個元素刪除,則M以後的元素向左移動,表長減1

       定位對應的題型:一般與時間複雜度聯絡,我們可以想象定位必定是一個一個依次尋找,所以要用到一次迴圈,在表長為N的表上定位時間複雜度就為O(N)。


       鏈式儲存常見的有單鏈表、迴圈鏈表、雙向迴圈鏈表。加入了指標,指向下一資料元素,尾節點指標為Nullnull 指標,如果頭指標指向尾指標則為空白單鏈表。迴圈鏈表的最後一個節點的指標指向第一個結點。雙向迴圈鏈表加入了一個指向前驅結點的指標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......餘下全文>>
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.