線性表(順序表示,鏈式表示,一元多項式相加)

2021-08-18 17:25:17 字數 4552 閱讀 8402



1.線性表的定義和特點:

元素之間的關係是線性,同一張線性表中的元素必定具有相同的特徵。

線性表是乙個相當靈活的資料,長度可以根據需要增長或縮短,對元素進行訪問,插入和刪除。

抽象資料型別線性表的定義如下:

adt list

資料關係:r=

基本操作 :

1.  初始化   initlist(&l)

2.  取值       getelem(l, i, &e)

3.  查詢       locateelem(l, e, compare())

4.  插入       listinsert(&l, i, e)

5.  刪除       listdelete(&l, i, &e)

……} adt list

初始化:initlist(&l)

操作結果:構造乙個空的線性表l。

取值:getelem(l, i, &e)

初始條件:線性表l已存在,1≤i≤listlength(l)。

操作結果:用e返回l中第i個資料元素的值。

線性表的順序表示又稱為

順序儲存結構或

順序映像。邏輯上和物理上都相鄰。

順序儲存定義:把邏輯上相鄰的資料元素儲存在物理上相鄰的儲存單元中的儲存結構。

線性表中的第i個元素的儲存位置滿足上式。

順序儲存結構型別定義:

#define maxsize 10000  // 順序表的最大長度

typedef struct elemtype;    (book)

typedef structsqlist;         // 順序儲存結構型別為 sqlist

線性表的重要基本操作的演算法實現:

1. 初始化線性表l (

引數用引用)

status initlist(sqlist &l)

2. 初始化線性表l (

引數用指標)

status initlist(sqlist *l)

3.取值(根據位置i獲取相應位置元素的內容)

int getelem(sqlist l,

int i, elemtype &e)

4.查詢(根據指定資料獲取資料所在的位置)查詢元素e

int locateelem(sqlist l, elemtype e)      

return 0;}

5.插入

(1)判斷插入位置 i 是否合法。

(2)判斷順序表的儲存空間是否已滿。     

(3)將第n至第 i 位的元素依次向後移動乙個位置,

空出第i個位置。

(4)將要插入的新元素e放入第i個位置。

(5)表長加1,插入成功返回ok。

插入元素e:

status listinsert(sqlist &l,int i ,elemtype e)

6.刪除第i個元素

status listdelete(sqlist &l, int i, elemtype &e)

順序表的查詢、插入、刪除演算法的平均時間複雜度為t(n)=o(n)

一、線性列表

鏈式儲存結構:用

任意的儲存單位儲存線性表的資料結構,結點在儲存器中的位置是任意的,即邏輯上相鄰的資料元素在物理上不一定相鄰。

線性表的鏈式表示又稱為

非順序映像或

鏈式映像。

結點:資料元素的儲存映像。儲存其本身的資訊和乙個知識其直接後繼的資訊。

由資料域和指標域兩部分組成:

資料域:儲存資料元素資訊;

指標域:儲存直接後繼結點的儲存位置,其中儲存的資訊稱為指標或者是鏈

鍊錶:n個結點鏈結成乙個鍊錶(線性表的鏈式儲存結構)。鍊錶的每乙個結點中只包含乙個指標域故又稱為線性鍊錶或者單鏈表。

頭指標:指向鍊錶中頭結點的指標

首元結點:指煉表中儲存第乙個資料元素a1的結點

頭結點:在鍊錶的首元結點之前附設的乙個結點;資料域內只放空表標誌和表長等資訊或為空所以他不計入鍊錶長度值。

順序訪問法,訪問第乙個結點和最後乙個節點的時間不等。

演算法描述:

1.插入:s->next=p->next;      p->next=s

步驟:(1)找到ai-1儲存位置p

(2)生成乙個新結點*s

(3)將新結點*s的資料域置為x

(4)新結點*s的指標域指向結點ai

(5)令結點*p的指標域指向新結點*s

status listinsert_l(linklist &l,int i,elemtype e)  // 尋找第i−1個結點

if(!p)  return error;  // i大於表長 + 1或者小於1

s=new lnode;  // 生成新結點s,將該結點的初始位置賦值給指標變數s

s->data=e;                    // 將結點s的資料域置為e

s->next=p->next;                  // 將結點s插入l中

p->next=s;

return ok;

}//listinsert_l

2.刪除:p->next = p->next->next

步驟:(1)找到ai-1儲存位置p

(2)臨時儲存結點ai的位址在q中,以備釋放

(3)令p->next指向ai的直接後繼結點

(4)將ai的值保留在e中

(5)釋放ai的空間

status listdelete_l(linklist &l,int i,elemtype &e)

if(!(p->next)||j>i-1) return error; //刪除位置不合理

q=p->next;                 // 臨時儲存被刪結點的位址以備釋放

p->next=q->next;       // 改變刪除結點前驅結點的指標域

e=q->data;                   // 儲存刪除結點的資料域

delete q;                   // 釋放刪除結點的空間

return ok;

}//listdelete_l

查詢,從前插入和刪除的時間複雜度都是

o(n),因為要從頭查詢前驅結點。

單鏈表和順序儲存結構不同他是一種

動態結構。整個可用儲存空間可為多個鍊錶共同享用,每個鍊錶占用的空間不需預先分配劃定,而是可以由系統應需要即時生成。

動態生成鍊錶的過程:從「空表」的初始狀態起,依次建立各元素結點,並逐個插入鍊錶。

從表尾到表頭逆向建立單鏈表:

void createlist_f(linklist &l,int n)

}//createlist_f

二、迴圈列表

從迴圈鍊錶中的任何乙個結點的位置都可以找到其他所有結點。

三、雙向列表

1.儲存結構:

typedef struct dulnodedulnode, *dulinklist

2.雙向表的插入:

status listinsert_dul(dulinklist &l,int i,elemtype e)

3.雙向表的刪除:

status listdelete_dul(dulinklist &l,int i,elemtype &e)

順序表和煉表之間的比較:

演算法步驟:

① 指標p1和p2初始化,分別指向pa和pb的首元結點。

② p3指向和多項式的當前結點,初值為pa的頭結點。

③ 當指標p1和p2均未到達相應表尾時,則迴圈比較p1和p2所指結點對應的指數值(p1->expn與p2->expn),有下列3種情況:

* 當p1->expn等於p2->expn時,則將兩個結點中的係數相加,若和不為零,則修改p1所指結點的系數值,同時刪除p2所指結點,若和為零,則刪除p1和p2所指結點;

* 當p1->expn小於p2->expn時,則應摘取p1所指結點插入到「和多項式」鍊錶中去;

* 當p1->expn大於p2->expn時,則應摘取p2所指結點插入到「和多項式」鍊錶中去。

④ 將非空多項式的剩餘段插入到p3所指結點之後。

⑤ 釋放pb的頭結點。

多項式加法:

void addpolyn(polynomial &pa,polynomial &pb)

else

delfirst(hb,qb);freenode(qb);qb=nextpos(pb,hb);

qa=nextpos(pa,ha);break;

case 1:  //a>b

delfirst(hb,qb);insfirst(ha,qb);

qb=nextpos(pb,hb);ha=nextpos(pa,ha);break;

}//switch

}//while

freenode(hb);

}有序表的合併:

void mergelist_l(linklist &la,linklist &lb,linklist &lc)

else

pc->next=pa?pa:pb;    //插入剩餘段

delete lb;             //釋放lb的頭結點

}

線性表順序表示

include include include define listlength 100 typedef struct datatype typedef struct initlist,list 建立並返回乙個空的線性表 list createlist void else printf out o...

Java實現線性表 順序表示和鏈式表示(java)

順序表示和鏈式表示的比較 1.讀寫方式 順序表可以順序訪問,也可以隨機訪問 鍊錶只能從表頭順序訪問元素 2.邏輯結構與物理結構 順序儲存時,邏輯上相鄰的元素其對應的物理儲存位置也相鄰 鏈式儲存時,邏輯上相鄰的元素,其物理儲存位置則不一定相鄰 3.查詢 插入和刪除操作 按值查詢,當線性表在無序的情況下...

線性表的鏈式表示

上篇文章是線性表的順序表示,本篇便是線性表的鏈式表示。主函式的步驟包括,輸入線性表資料,對鍊錶的刪除,插入。利用指標進行對鍊錶的訪問。同時為了增加程式可讀性,將結構體定義為lnode,linklist。include 線性表的鏈式表示 using namespace std typedef stru...