某個紫色封皮的書的作業。。
#include<stdio.h> #include<stdlib.h> #define ElementType int //數據域的數據類型,用預定義方便改數據類型的時候替換,這里根據要求用int typedef struct LNode *List; //建立類型LNode,同時LNode的指針類型List指向LNode,可以用“List p”來創建指向節點的指針 struct LNode{ ElementType Data; //定義數據域 List Next; //定義指針域 }; List MakeEmpty(ElementType X){ //這里沒弄頭結點,直接通過第一個要插入的元素來創建鏈表 List PtrL; PtrL = (List)malloc(sizeof(struct LNode)); PtrL->Data = X; return PtrL; } List InsertAtLast(ElementType X,List Tail){ //插入到鏈表尾端的函數,Tail指向鏈表尾 List p = (List)malloc(sizeof(struct LNode)); p->Data = X; p->Next = NULL; Tail->Next = p; //接到鏈表末尾 return p; //返回尾節點的指針 } void PrintList(List PtrL){ //遍歷輸出鏈表到控制台 while(PtrL->Next != NULL){ printf("%d ",PtrL->Data); PtrL = PtrL->Next; } printf("%d\n",PtrL->Data); } //冒泡排序從小到大 void swap(int *p,int *q){ int temp = *p; *p = *q; *q = temp; return; } void bubbleSort(int n[],int length) { int i = 0; int j = 0; int flag = 1; for(i = length - 1; i >= 0 && flag; i--) { flag = 0;//稍作優化,下一組再沒有做交換的時候說明已經有序了 for(j = 0; j < i; j++) { if(n[j + 1] < n[j]) { swap(&n[j],&n[j + 1]); flag = 1; } } } } /*2019.11.26 錄微課來重整一下代碼,優化了核心的代碼*/ List concat(List list1,List list2){ List head, p; if(list1->Data <= list2->Data){ head = list1; list1 = list1->Next; }else{ head = list2; list2 = list2->Next; } p = head; while(list1 != NULL && list2 != NULL){ if(list1->Data <= list2->Data){ p->Next = list1; list1 = list1->Next; }else{ p->Next = list2; list2 = list2->Next; } p = p->Next; } p->Next = (list1 == NULL) ? list2 : list1; //結尾情況 return head; } /*加了頭結點之后的concat函數,簡化了幾行代碼*/ List concat1(List list1,List list2){ List p; List head = malloc(sizeof(struct LNode)); head->Data = -9999; p = head; while(list1 != NULL && list2 != NULL){ if(list1->Data <= list2->Data){ p->Next = list1; list1 = list1->Next; }else{ p->Next = list2; list2 = list2->Next; } p = p->Next; } p->Next = (list1 == NULL) ? list2 : list1 ; return head; } /*原來的連接函數,感覺我好蠢*/ List concat2(List list1,List list2){ List p = list1; List q = list2; List tmp1; List tmp2; //list2前面幾個元素比list1要小的情況下 if (q->Data < p->Data){ list1 = list2; //最后return的是指向頭結點的指針 while(q->Data < p->Data){ tmp1 = q; //要求結束條件的指針的前一個,用tmp1保留 q = q->Next; } tmp1->Next = p; } //中間的插入 while(q != NULL && p->Next != NULL){ if (q->Data >= p->Data && q->Data < p->Next->Data){ tmp2 = q; q = q->Next; tmp2->Next = p->Next; p->Next = tmp2; } else{ p = p->Next; } } //list2最后幾個元素比list1最后一個元素要大的情況 if (q != NULL){ p->Next = q; } return list1; } int main(int argc, char const *argv[]){ List list1,tail1,list2,tail2; //兩個鏈表,四個指針,分別指向兩鏈表頭結點和尾節點 int i = 0; ElementType temp[5] = {0}; //用來臨時存儲輸入的五個數字 printf("Input list1 for 5 numbers(divided by space):" ); while(scanf("%d",&temp[i]) != EOF && getchar() != '\n')i++; //讀入空格隔開的5個整數型到數組 bubbleSort(temp,5); list1 = MakeEmpty(temp[0]); //建立list1 tail1 = list1; //初始化尾節點 for ( i = 1; i < 5; ++i){ //逐個插入的方法來將后四個插入到鏈表 tail1 = InsertAtLast(temp[i],tail1); } PrintList(list1); i = 0; printf("Input list2 for 5 numbers(divided by space):" ); while(scanf("%d",&temp[i]) != EOF && getchar() != '\n')i++; bubbleSort(temp,5); list2 = MakeEmpty(temp[0]); tail2 = list2; for ( i = 1; i < 5; ++i){ tail2 = InsertAtLast(temp[i],tail2); } PrintList(list2); list1 = concat(list1,list2); printf("list1 appends list2: "); PrintList(list1); return 0; }