某个紫色封皮的书的作业。。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define ElementType int //数据域的数据类型,用预定义方便改数据类型的时候替换,这里根据要求用int 4 typedef struct LNode *List; //建立类型LNode,同时LNode的指针类型List指向LNode,可以用“List p”来创建指向节点的指针 5 struct LNode{ 6 ElementType Data; //定义数据域 7 List Next; //定义指针域 8 }; 9 10 List MakeEmpty(ElementType X){ //这里没弄头结点,直接通过第一个要插入的元素来创建链表 11 List PtrL; 12 PtrL = (List)malloc(sizeof(struct LNode)); 13 PtrL->Data = X; 14 return PtrL; 15 } 16 17 List InsertAtLast(ElementType X,List Tail){ //插入到链表尾端的函数,Tail指向链表尾 18 List p = (List)malloc(sizeof(struct LNode)); 19 p->Data = X; 20 p->Next = NULL; 21 Tail->Next = p; //接到链表末尾 22 return p; //返回尾节点的指针 23 } 24 25 void PrintList(List PtrL){ //遍历输出链表到控制台 26 while(PtrL->Next != NULL){ 27 printf("%d ",PtrL->Data); 28 PtrL = PtrL->Next; 29 } 30 printf("%d\n",PtrL->Data); 31 } 32 33 //冒泡排序从小到大 34 void swap(int *p,int *q){ 35 int temp = *p; 36 *p = *q; 37 *q = temp; 38 return; 39 } 40 void bubbleSort(int n[],int length) { 41 int i = 0; 42 int j = 0; 43 int flag = 1; 44 for(i = length - 1; i >= 0 && flag; i--) { 45 flag = 0;//稍作优化,下一组再没有做交换的时候说明已经有序了 46 for(j = 0; j < i; j++) { 47 if(n[j + 1] < n[j]) { 48 swap(&n[j],&n[j + 1]); 49 flag = 1; 50 } 51 } 52 } 53 } 54 55 List concat(List list1,List list2){ 56 List p = list1; 57 List q = list2; 58 List tmp1; 59 List tmp2; 60 //list2前面几个元素比list1要小的情况下 61 if (q->Data < p->Data){ 62 list1 = list2; //最后return的是指向头结点的指针 63 while(q->Data < p->Data){ 64 tmp1 = q; //要求结束条件的指针的前一个,用tmp1保留 65 q = q->Next; 66 } 67 tmp1->Next = p; 68 } 69 70 //中间的插入 71 while(q != NULL && p->Next != NULL){ 72 if (q->Data >= p->Data && q->Data < p->Next->Data){ 73 tmp2 = q; 74 q = q->Next; 75 tmp2->Next = p->Next; 76 p->Next = tmp2; 77 } 78 else{ 79 p = p->Next; 80 } 81 } 82 83 //list2最后几个元素比list1最后一个元素要大的情况 84 if (q != NULL){ 85 p->Next = q; 86 } 87 88 return list1; 89 } 90 91 int main(int argc, char const *argv[]){ 92 List list1,tail1,list2,tail2; //两个链表,四个指针,分别指向两链表头结点和尾节点 93 int i = 0; 94 ElementType temp[5] = {0}; //用来临时存储输入的五个数字 95 printf("Input list1 for 5 numbers(divided by space):" ); 96 while(scanf("%d",&temp[i]) != EOF && getchar() != '\n')i++; //读入空格隔开的5个整数型到数组 97 bubbleSort(temp,5); 98 list1 = MakeEmpty(temp[0]); //建立list1 99 tail1 = list1; //初始化尾节点 100 for ( i = 1; i < 5; ++i){ //逐个插入的方法来将后四个插入到链表 101 tail1 = InsertAtLast(temp[i],tail1); 102 } 103 PrintList(list1); 104 i = 0; 105 printf("Input list2 for 5 numbers(divided by space):" ); 106 while(scanf("%d",&temp[i]) != EOF && getchar() != '\n')i++; 107 bubbleSort(temp,5); 108 list2 = MakeEmpty(temp[0]); 109 tail2 = list2; 110 for ( i = 1; i < 5; ++i){ 111 tail2 = InsertAtLast(temp[i],tail2); 112 } 113 PrintList(list2); 114 list1 = concat(list1,list2); 115 printf("list1 appends list2: "); 116 PrintList(list1); 117 return 0; 118 }