資料結構:任意長度的有序連結串列歸併排序
阿新 • • 發佈:2019-09-02
難點:不知道何時輸入結束,剛開始想了很長時間,後來想到可以通過if (getchar()=='\n') 是否遇到回車鍵。
有特點的程式碼段:可以實現任意的輸入,直到遇到回車鍵
printf("請輸入資料:"); while(1){ head = (LinkNode *)malloc(sizeof(LinkNode)); if(head == NULL){ printf("no enough merrory!"); exit(0); } scanf("%d",&data); //遇回車中斷 head->data = data; head->next = NULL; current ->next = head; current = head; if (getchar()=='\n') { break; } }
完整程式碼:
#include<stdio.h> #include<stdlib.h> //將兩個有序序列使用歸併排序,並輸出 //使用連結串列實現有序表 typedef struct Node{ int data; struct Node* next; }LinkNode; //初始化連結串列 LinkNode* Init(LinkNode *head){ //使用頭節點的重要性 //head剛開始一定是空的 int data; LinkNode dummy, *current = &dummy; dummy.next = head; //直到輸入換行符才結束 printf("請輸入資料:"); while(1){ head = (LinkNode *)malloc(sizeof(LinkNode)); if(head == NULL){ printf("no enough merrory!"); exit(0); } scanf("%d",&data); //遇回車中斷 head->data = data; head->next = NULL; current ->next = head; current = head; if (getchar()=='\n') { break; } } return dummy.next; } //使用遞迴將有序連結串列歸併排序 LinkNode * merge_sort(LinkNode *left, LinkNode *right){ if(left == NULL) return right; else if(right == NULL) return left; else if(left->data <= right->data){ left->next = merge_sort(left->next, right); return left; }else if(left->data > right->data){ right->next = merge_sort(left,right->next); return right; } } //列印連結串列 void print(LinkNode* head){ while(head != NULL){ printf("%d ", head->data); head = head->next; } printf("\n"); } int main(){ LinkNode *Thead,*Thead02; Thead = Init(Thead); print(Thead); Thead02 = Init(Thead02); print(Thead02); Thead = merge_sort(Thead,Thead02); print(Thead); return 0; }
結果: