線性表的鏈式存儲結構 :
鏈式存儲表示 :
typedef struct LNode{
? ElemType ? data;
? Struct LNode *next;
}LNode,*LinkList;
基本操作在鏈表上的實現 :
(1) ?? 單鏈表的取元素算法(經典)
Status GetElem_L(LinkList L, int i,ElemType &e)
{
p=L->next; j=1;
while(p && j<i)
{
????? p=p->next;++j;
}
if(!p || j>i) return ERROR;
e=p->data;
return OK;
}
算法分析
:
基本操作是
:
比較
j
和
I,
并把指針后移
,
循環體執行的次數
,
與被查元素的位置有關
.
假設表長為
n,
如果
1<=i<=n,
那么循環體中語句的執行次數為
i-1.
否則次數為
n
所以時間復雜度為
O(n).
Status ListInsert_L(LinkList &L, int i,ElemType e)
{
?? p=L;j=0;
?? while(p&&j<i-1)
????? { p=p->next;++j}
?? if(!p || j>i-1)
????? return ERROR;
?? s = (LinkList)malloc(sizeof(LNode));
?? s->data = e;
?? s->next = p->next;
?? p->next =s;
?? return OK;
}
(3)
??
刪除元素算法
Status ListDelete_L(LinkList &L, int i,ElemType &e)
{
?? p=L;j=0;
while(p &&j<i-1)
?? {p=p->next;++j}
if(!p ||j>i-1)
????? return? ERROR;
??
q=p->next;
?? p->next =q->next;
?? e =q->data;
?? free(q);
?? return OK;
}
算法分析
:
插入和刪除算法
,
都要先找到第
i-1
個節點
,
所以時間復雜度為
O(n);
void CreateList_L(LinkList &L,int n){
?L =(LinkList)malloc(sizeof(LNode));
?L->next = null;
? for(i = n;i>0;--i){
?
? p =(LinkList)malloc(sizeof(LNode));
? scanf(&p->data);
? p->next = L->next;
? L->next =p;
? }
}
算法分析 :
按照逆序循環輸入 n 個數據元素的值 , 建立新節點 . 并插入 . 因此算法的時間復雜度為 O(n).