某个紫色封皮的书的作业。。
#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; }