C语言建立两个有序链表,在不创建新链表的情况下连接两个链表并输出

某个紫色封皮的书的作业。。

  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 }

猜你喜欢

转载自www.cnblogs.com/RichieLeonhardt/p/10586828.html