1. 程式人生 > >資料結構——單迴圈連結串列的

資料結構——單迴圈連結串列的

迴圈連結串列:迴圈連結串列是一個首尾相接的連結串列。將單鏈表最後一個結點的指標域由NULL改為指向表頭結點,就得到了單鏈形式的迴圈連結串列,並稱為迴圈單鏈表。同樣還可以有多重鏈的迴圈連結串列。

//定義結構體
typedef struct Node {
 int data;
 struct Node *next;
}Node,*LinkList;

	//初始化迴圈單鏈表:
    LinkList *InitCLinkList(LinkList *CL)//CL用來接收待初始化的迴圈單鏈表的頭指標變數的地址
	{
 		*CL = (Node *)malloc(sizeof(Node));//建立頭結點
 		(*CL)->next = *CL;//建立空的迴圈單鏈表CL
 		return CL;
	}

//尾插法建立單鏈表,並讓最後一個結點的指標域指向頭結點
void CreateFromTail(LinkList CL)//尾插法建立單鏈表
{
 Node *s, *rear;
 int i;
 rear = (Node *)CL;
 int flag = 1;
 while (flag)
 {
  scanf("%d", &i);
  if (i != -1)
  {
   s = (Node *)malloc(sizeof(Node));
   s->data = i;
   rear->next = s;
   rear = s;
  }
  else
  {
   flag = 0;
   
  }
 }
 rear->next = CL;
}

//迴圈單鏈表的合併演算法,此演算法的時間複雜度為:O(n)
LinkList merge_1(LinkList LA, LinkList LB)
{
 Node *p, *q;
 p = LA;
 q = LB;
 while (p->next != LA)
 {
  p = p->next;
 }
 while (q->next != LB)
 {
  q = q->next;
 }
 q->next = LA;
 p->next = LB->next;
 free(LB);
 return LA;
}
//迴圈單鏈表的的合併演算法,此演算法的時間複雜度為:O(1)
LinkList merge_2(LinkList LC, LinkList LD)
{
 Node *p;
 p = LC->next;
 LC->next = LD->next->next;
 free(LD->next);
 LD->next = p;
 return LD; 
}
//列印輸出單鏈表
void print(LinkList CL)
{
 Node *p;
 p = CL->next;
 printf("單迴圈連結串列中的元素為:");
 while (p!=CL)
 {
  printf("%5d", p->data);
  p = p->next;
 }
 printf("\n");
}
//驗證
int main()
{
 LinkList CL;
 InitCLinkList(&CL);
 printf("請輸入資料,輸入-1結束:\n");
 CreateFromTail(CL);
 print(CL);
 system("CLS");
 printf("請輸入表A的資料,輸入-1結束:\n");
 LinkList LA;
 InitCLinkList(&LA);
 CreateFromTail(LA);
 print(LA);
 printf("請輸入表B的資料,輸入-1結束:\n");
 LinkList LB;
 InitCLinkList(&LB);
 CreateFromTail(LB);
 print(LB);
 merge_1(LA, LB);
 print(LA);
 printf("merge_1的演算法時間複雜度為:O(n)");
 //system("CLS");
 printf("\n請輸入表C的資料,輸入-1結束:\n");
 LinkList LC;
 InitCLinkList(&LC);
 CreateFromTail(LC);
 print(LC);
 printf("請輸入表D的資料,輸入-1結束:\n");
 LinkList LD;
 InitCLinkList(&LD);
 CreateFromTail(LD);
 print(LD);
 merge_2(LC, LD);
 print(LD);
    return 0;
}