資料結構導論-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指向下一個,繼續
}