資料結構——單迴圈連結串列的
阿新 • • 發佈:2019-01-10
迴圈連結串列:迴圈連結串列是一個首尾相接的連結串列。將單鏈表最後一個結點的指標域由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;
}