1. 程式人生 > >資料結構導論-2.3 其他運算在單鏈表上的實現

資料結構導論-2.3 其他運算在單鏈表上的實現

一、尾插法建表1

演算法思路:每次在連結串列的尾部增加新的結點. 設資料元素的型別為int,利用InsertLinkList(LinkList head, int x, int i)來實現,依次增大插入位置,使新的結點鏈入到連結串列中。

演算法實現:

LinkList CreatLinkList1( )

{ LinkList head;

int x,i;

head=InitiateLinkList( ) //建空表

i=1; //插入位置初值

scanf("%d",&x); //讀入第一個元素

while (x!=flag) // flag表示結束標誌

{ InsertLinkList(head,x,i)

i++

scanf("%d",&x); }

return head; }

時間複雜度為O(n2)

二、尾插法建表2

演算法思路:每次在連結串列的尾部增加新的結點.用一個指標指向表尾,為新的結點鏈入指明瞭位置。

演算法實現:

LinkList CreatLinkList2( )

{ LinkList head;

Node *q,*t;

int x;

head=malloc(sizeof(Node)); //生成頭結點

q=head; //尾指標置初值

scanf("%d",&x);

while (x!=flag) //flag表示結束標誌

{ t=malloc(sizeof(Node)); //生成新結點

t->data=x;

q->next=t; //新結點鏈入

q=t; //修改尾指標

scanf("%d",&x);

}

q->next=NULL; return head; //q指向尾指標,置尾結點標誌

}

該演算法的時間複雜度為O(n)。

三、頭插法建表

演算法思路:每次在連結串列的頭部增加新的結點.

演算法實現:

LinkList CreatLinkList3( )

{ LinkList head;

Node *p;

int x;

head=malloc(sizeof(Node)); //生成頭結點

head->next=NULL;

scanf("%d",&x);

while (x!=flag) // flag為根據實際情況設定的結束資料輸入的標誌資料

{ p=malloc(sizeof(Node));

p->data=x; //申請結點,添裝資料

p->next=head->next; //頭插:插入新結點在第一個結點處

head->next=p;

scanf ("%d",&x);

}

return head;

}

該演算法的時間複雜度為O(n),但其形成的連結串列資料順序與資料輸入順序相反。

四、刪除重複結點

演算法思路:用指標q指向第一個資料元素結點,從它的後繼結點開始到表的結束,查詢與其值相同的結點並刪除之;q指向下一個結點;依此類推,q指向最後結點時演算法結束。

void PurgeLinkList(LinkList head)

{ Node *p,*q,*r;

q=head->next; //q指向第一個結點

while (q!=NULL)

{ p=q;

while (p->next!=NULL) //從*q的後繼開始找重複結點

if (p->next->data==q->data)

{ r=p->next; //找到重複結點,用r指向,刪除*r

p->next=r->next;

free(r);

}

else p=p->next;

q=q->next; } //q指向下一個,繼續

}