單鏈表的應用實例

1、有一個帶頭結點的單鏈表L=(a1,b1,a2,b2,a3,b3…an,bn),設計一個算法將其拆分爲兩個帶頭結點的單鏈表L1和L2,其中L1=(a1,a2,a3,a4…an),L2=(bn,…b3,b2,b1),要求L1使用L的頭節點。

解:利用原單鏈表L中的所有結點通過改變指針域重組成兩個單鏈表L1和L2。由於L1中結點的相對順序與L中的相同,所以採用尾插法建立單鏈表L1;由於L2中結點的相對順序與L中的相反,所以採用頭插法建立單鏈表L2。代碼如下:

void split(LinkNode * &L,LinkNode * &L1,LinkNode * &L2)
{
	LinkNode *p=L->next,*q,*rl;    //p指向第一個數據結點
	L1=L;
	rl=L1;           //rl始終指向L1的尾結點
	L2=(LinkNode *)malloc(sizeof(LinkNode));    //創建L2的頭結點
	L2->next=NULL;
	while(p!=NULL)
	{
		rl->next=p;      //採用尾插法將p插入到L1中
		rl=p;
		p=p->next;
		q=p->next;
		p->next=L2->next;		//採用頭插法將結點p插入L2中
		L2->next=p;
		p=q;      //重定位
	}
	rl->next=NULL;
}

2、設計一個算法,刪除一個單鏈表L中元素值最大的結點(假設這樣的結點唯一)。

解:在單鏈表中刪除一個結點先要找到它的前驅結點,用指針p掃描整個單鏈表,pre指向結點p的前驅結點,再掃描時用maxp指向data域值最大的結點,maxpre指向maxp所指結點的前驅結點。當單鏈表掃描完畢後,通過maxpre所指的結點刪除其後的結點,即刪除了結點值最大的結點。算法如下:

void delmaxnode(LinkNode * &L)
{	
	LinkNode *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
	while(p!=NULL)
	{
		if(maxp->data<p->data)
		{
			maxp=p;
			maxpre=pre;
		}
		pre=p;
		p=p->next;
	}
	maxpre->next=maxp->next;
	free(maxp);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章