|
|
- #include<stdio.h>
- #include<stdlib.h>
- typedef struct list /* 宣告鏈結串列結構 */
- {
- int data; /* 資料欄位 */
- struct list *link; /* 指標欄位 */
- }node;
- node *Z=NULL;
- void print_list(node *);
- node *create_list(int *, int);
- void free_list(node *);
- void concatenate(node *, node *);
- void main( )
- {
- node *X=NULL, *Y=NULL;
- int array1[6]={ 1, 3, 5, 7, 9, 11 };
- int array2[6]={ 2, 4, 6, 8, 10, 12 };
- X=create_list(array1, 6); /* 建立鏈結串列X */
- Y=create_list(array2, 6); /* 建立鏈結串列Y */
- printf("原來的鏈結串列X:\n");
- print_list(X);
- printf("原來的鏈結串列Y:\n");
- print_list(Y);
- concatenate(X, Y); /* 將鏈結串列X,Y合併成Z */
- printf("合併後的鏈結串列Z:\n");
- print_list(Z);
- free_list(Z);
- }
- void print_list(node *head) /* 印出鏈結串列的內容 */
- {
- node *ptr; /* 走訪鏈結串列所用的指標 */
- for(ptr=head; ptr!=NULL; ptr=ptr->link)
- printf("[%d]", ptr->data); /* 印出鏈結串列節點內容 */
- printf("\n"); /* 換行 */
- }
-
- node *create_list(int *array, int len) /* 依陣列架構出鏈結串列 */
- {
- node *head; /* 鏈結串列的起始指標 */
- node *pre_node; /* 新節點之前節點的指標 */
- node *new_node; /* 新節點的指標 */
- int i;
- for(i=0; i<len; i++)
- {
- new_node=(node *)malloc(sizeof(node)); /* 配置記憶體空間給新節點 */
- if(new_node == NULL)
- {
- printf("記憶體配置失敗!\n");
- exit(1); /* 立刻結束程式 */
- }
- new_node->data=array; /* 將陣列內容置入鏈結串列中 */
- if(i == 0) /* 當第一次放入時,將head指標指向第一個節點 */
- {
- new_node->link=NULL;
- head=new_node;
- }
- else /* 先走訪至最後一個節點,再加入新的節點 */
- {
- for(pre_node=head; pre_node->link!=NULL; pre_node=pre_node->link);
- new_node->link=pre_node->link;
- pre_node->link=new_node;
- }
- }
- return head; /* 將改變過後的鏈結串列傳回 */
- }
- void free_list(node *head) /* 將整個鏈結串列的記憶體歸還 */
- {
- node *free_node;
- while(head != NULL)
- {
- free_node=head;
- head=head->link;
- free(free_node);
- }
- }
- void concatenate(node *X, node *Y)
- {
- node *ptr;
- if(X == NULL) /* 若X為空串列,則將Y的位址傳回 */
- Z=Y;
- else if(Y == NULL) /* 若Y為空串列,則將X的位址傳回 */
- Z=X;
- else
- { /* 走訪至尾端節點 */
- for(ptr=X, Z=X; ptr->link!=NULL; ptr=ptr->link);
- /* 將鏈結串列X的尾端節點指向鏈結串列Y的開始節點 */
- ptr->link=Y;
- }
- }
複製代碼 |
|