1. 程式人生 > >迴圈單向連結串列-合併演算法

迴圈單向連結串列-合併演算法

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

基礎知識

        迴圈連結串列是單鏈表的另一種形式,它是一個首尾相接的連結串列,其特點是將單鏈表最後一個結點的指標域由NULL改為指向頭結點或線性表中的第一個結點,就得到了單鏈形式的迴圈連結串列,並稱為迴圈單鏈表。

迴圈連結串列的圖解

        暫時空缺

合併思路

        先找到兩個連結串列的尾,並分別由指標p、q指向他們,然後將第一個連結串列的尾與第二個連結串列的第一個結點連結起來,並修改第二個表的尾Q,使它的鏈域指向第一個表的頭結點。

        注意:連結串列合併後,需記得釋放被合併連結串列的頭結點。       

程式碼實現

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

typedef struct Node {
	int data;
	struct Node * next;
} Node, *LinkList;

void initLink(LinkList *link);
void create(LinkList link, int start);
void fusion(LinkList linkA, LinkList linkB);
int main(int argc, char *argv[]) {
	LinkList LinkA, LinkB;
	initLink(&LinkA);
	initLink(&LinkB);
	create(LinkA, 1);
	create(LinkB, 10);
	fusion(LinkA, LinkB);
	Node *p;
	p = LinkA->next;
	while (p != LinkA) {
		printf("%d\n", p->data);
		p = p->next;
	}
	return 0;
}
/**
 * 初始化連結串列
 */
void initLink(LinkList *link) {
	*link = (LinkList)malloc(sizeof(Node));
	(*link)->next = NULL;
}

/**
 * 建立迴圈連結串列
 */
void create(LinkList link, int start) {
	Node *node, *q;
	q = link;
	int i;
	for (i = start; i < start + 5; i++) {
		node = (Node *)malloc(sizeof(Node));
		node->data = i;
		link->next = node;
		link = node;
	}
	link->next = q;
}

/***
 * 合併迴圈連結串列 
 */
void fusion(LinkList linkA, LinkList linkB) {
	Node *p, *q;
	p = linkA->next;
	q = linkB->next;
	while (p->next != linkA) {
		p = p->next;
	}
	while (q->next != linkB) {
		q = q->next;
	}
	p->next  = linkB->next;
	q->next = linkA;
	/*釋放LinkB的頭結點*/ 
	fre