線性表:n個資料元素的有限序列。
長度為0稱為空表。
線性表的順序表示指的是同一組位址連續的儲存單元依次儲存線性表的資料元素。
假設每個元素佔l個儲存單元,以所佔的第乙個單元的儲存位址作為資料元素的儲存位置,則線性表中第i+1個元素的儲存位置loc(ai+1)和第i個資料元素的儲存位置loc(ai)之間滿足下列關係:
loc(ai+1)=loc(ai)+l一般的,線性表的第
i
個資料元素ai的儲存位置為:
loc(ai)=loc(a1)+(i-1)*lloc(a1)是線性表的第乙個資料元素a1的儲存位置,通常稱做起始位置或基位址。
順序表特點:表中相鄰的元素賦以相鄰的儲存位置
#define list.init_size 100 //線性表儲存空間的初始化分配量
#define listincrement 10 //線性表儲存空間的分配增量
typedef struct
status initlist.sq(sqlist &l)
在第i(1<=i<=n)個元素之前插入乙個元素時,需要將第n至第i(共n-i+1)個元素向後移動乙個位置
時間複雜度為o(n)[n/2]
status listinsert.sq(sqlist &l,int i,elemtype e)
q=&(l.elem[i-1]);
for(p=&(l.elem[l.length-1]);p>=q;--p)
*p=e;//插入e
++l.length;//表長增1
return ok;
}
刪除第i(1<=i<=n)個元素時需將從第i+1至第n(共n-i)個元素依次向前移動乙個位置
時間複雜度為o(n)[(n-1)/2]
status listdelete.sq(sqlist &l,int i,elemtype &e)
依次比較
時間複雜度o(l.length)
int locateelem.sq(sqlist l,elemtype e,status(*compare)(elemtype,elemtype))
時間複雜度 o(la.length+lb.length)
void mergelist.sq(sqlist la,sqlist lb,sqlist &lc)
while(pa<=pa.last) *pc++=*pa++; //插入la的剩餘元素
while(pb<=pb.last) *pc++=*pb++;//插入lb的剩餘元素
}mergelist.sq
不要求邏輯上相鄰的元素在物理位置上相鄰,是去了順序表的隨機訪問的優點為了表示每個資料元素ai與其直接後繼資料元素ai+1之間的邏輯關係,對資料元素ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後繼的資訊。這兩部分構成元素ai的資料映像,稱為節點,包括:儲存資料的資料域,儲存後繼的指標域、
//-----線性表的單鏈表儲存結構-----
typedef struct lnodelnode, *linklist
假設l是linklist型的變數,則l為單鏈表的頭指標,他指向表中第乙個結點,若l為空。則所表示的線性表為空表,其長度n為0,
有時候我們在第乙個結點之前附設乙個結點,稱之為頭結點,頭結點的資料域可以不儲存任何資訊,也可儲存如線性表的長度等類的附加資訊,頭結點的指標域儲存指向第乙個結點的指標,若線性表為空表,則頭結點的指標域為空。
與順序儲存結構不同,鏈式儲存結構元素位置之間沒有特定的關係,假設p是指向線性表中第i個資料元素(結點ai)的指標,則p->next是指向第i+1個資料元素(結點ai+1)的指標。換句話說,若p->data=ai,則p->next->next=ai+1。所以,在單鏈表中,取的第i個資料元素必須從頭指標出發尋找,所以,單鏈表是非隨機儲存的。
時間複雜度o(n) while迴圈體的語句頻度與被查元素在表中位置有關,若1<=i<=n則頻度為i-1.否則頻度為n
status getelem.l(linklist l,int i,elemtype &e)
if(!p||j>i) return error;//第i個元素不存在
e=p->data;取第i個元素
return ok;
}
時間複雜度o(n)p後插入s
s->next = p->next; p->next=s;
status listinsert.l(linklist &l,int i,elemtype e)
if(!p||j>i) return error ;//i小於1或者大於表長
s=(linklist)malloc(sizeof(lnode));//生成新節點
s->data=e; s-next;//插入l中
p->next = s;
return ok;
}//listinsert l
時間複雜度o(n)q=p->next;p->next=q->next;//刪除並釋放節點
e=q->data;free(q);
return ok;
}//listdelete l;
時間複雜度o(n)void createlist l(linklist &l,int n)
}
void mergelist l(linklist &la,linklist &lb,linklist &lc)else
}pc->next=pa?pa:pb;//插入剩餘段
free(lb);//釋放lb的頭結點
}
表中最後乙個結點的指標指向頭結點,整個鍊錶形成乙個環,所以從表中任何乙個結點出發均可找到其他結點。操作與線性鍊錶一致,區別在於迴圈條件下不是p或p->next是否為空,而是他們是否等於頭指標,若在迴圈鍊錶中設立尾指標而不設定頭指標可以使操作簡化。比如線性表合併時,僅需將乙個表的表尾和另乙個表的表頭相接。
上述只有後繼指標,查詢下乙個為o(1) ,查詢前驅為o(n).為克服這種缺點,有了雙向鍊錶。
d->next->prior=d->prior->next=d與單迴圈鍊錶一樣,雙向鍊錶也可以有迴圈表。typedef struct dulnodedulnode ,*dulinklist
資料結構(線性表)
1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...
資料結構 線性表
參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...
資料結構 線性表
線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。按其邏輯儲存方式的不同可分為兩類線性表 順序表和鏈式表。其中鏈式表又可分為線性鍊錶 迴圈鍊錶和雙向鍊錶。下面分別介紹下這幾種線性表的資料結構 1.順序表 typedef struct sqlist 插入演算法 i到n...