數據結構學習(四)——循環單鏈表的操做之合併

所謂循環鏈表就是尾結點與頭結點相連的鏈表,整個鏈表造成一個環。而對於循環鏈表的插入與刪除運算,基本上與單鏈表相同,只是在判斷鏈表是否結束有所不一樣。下面的代碼操做實現了兩個循環單鏈表的合併。且核心代碼很少,主要是分別找到循環單鏈表的尾結點再進行後續操做。指針

#include <stdio.h>
#include <stdlib.h>

typedef struct list
{
	char data;
	struct list *next;
}linklist;

linklist *CreateLinklist_End(int *l);		//尾插法建立單循環鏈表
linklist *Linklist_Connect(linklist *h1,int l1, linklist *h2, int l2);	//單循環鏈表的合併
void ShowLinklist(linklist *h);		//輸出顯示鏈表

int main(void)
{
	linklist *head1, *head2;	
	int length1, length2;		//分別記錄兩個循環鏈表的長度

	printf("循環單鏈表的操做練習:\n");
	printf("建立兩個單循環鏈表:\n");
	printf("第一個鏈表數據輸入(請依次輸入字符數據,'#'號結束):\n");
	head1 = CreateLinklist_End(&length1);
	getchar();					//消除回車鍵爲後面輸入帶來的影響
	printf("第二個鏈表數據輸入(請依次輸入字符數據,‘#’號結束):\n");
	head2 = CreateLinklist_End(&length2);
	printf("第一個鏈表的數據依次爲:\n");
	ShowLinklist(head1);
	printf("其節點數目爲:%d\n", length1);
	printf("第二個鏈表的數據依次爲:\n");
	ShowLinklist(head2);
	printf("其節點數目爲:%d\n", length2);
	printf("第一個鏈表和第二個鏈表的合併輸出爲:\n");
	head1 = Linklist_Connect(head1, length1, head2, length2);
	ShowLinklist(head1);

	return 1;
}

//尾插法建立循環單鏈表,參數l表示建立鏈表的長度
linklist *CreateLinklist_End(int *l)
{
	linklist *head, *p, *e;
	char ch;

	*l = 0;
	head = (linklist*)malloc(sizeof(linklist));
	e = head;
	ch = getchar();

	while(ch != '#')
	{
		*l = *l + 1;
		p = (linklist*)malloc(sizeof(linklist));
		p->data = ch;
		e->next = p;
		e = p;
		ch = getchar();
	}
	e->next = head;			//循環鏈表的尾結點指針域指向頭節點

	return head;
}

//單循環鏈表的合併
linklist *Linklist_Connect(linklist *h1, int l1, linklist *h2, int l2)
{
	linklist *p1, *p2;
	int l=1;

	p1 = h1->next;
	while(l<l1)				//找到鏈表1的尾結點
	{
		l++;
		p1 = p1->next;
	}
	p2 = h2->next;
	l = 1;
	while(l<l2)				//找到鏈表2的尾結點
	{
		l++;
		p2 = p2->next;
	}
	p1->next = p2->next->next;		//核心操做:鏈表1的尾結點指向鏈表2輔助頭節點的下個節點
	p2->next = h1;					//鏈表的尾結點指向鏈表1的輔助頭節點
	free(p2->next);					//釋放鏈表的輔助頭節點

	return h1;
}

//輸出顯示鏈表
void ShowLinklist(linklist *h)
{
	linklist *p;

	p = h->next;
	while(p != h)				//循環單鏈表的結束判斷標誌爲不等於頭節點
	{
		printf("%c ", p->data);
		p = p->next;
	}
	printf("\n");
}
相關文章
相關標籤/搜索