数据结构-实现俩链表(int)拼接后还是有序的

来源:互联网 发布:淘宝耐克双肩包 编辑:程序博客网 时间:2024/06/03 01:42

ex2.2

#include<stdio.h>


typedef struct{

int    data;

struct Node* next;

}Node; 


typedef struct{

struct Node* listHead;//表基址 

int    listLength;//表长 

}L; 

/*************************************函数---自定义建表*******************************************/

L arrBuild()

{

  int end;

  printf("请输入一个int作为结束标志end= ");

  scanf("%d",&end);

  getchar();

  printf("\n\n");

  

  printf("请输入一组数据(int型):");

  int temp,listLength=0;

  Node* listHead=NULL; 

  scanf("%d",&temp);//&!&!&!

 

 

  Node* p1=(Node*)malloc(sizeof(Node));//位置

   if(p1==NULL) exit(-1);

  if(temp!=end)

  {

  p1->data=temp;

  p1->next=NULL;

 

  listHead=p1; 

  listLength++;

  }

  Node* q1=p1;//p1伴随指针 

  scanf("%d",&temp);

  while(temp!=end)

  {

   p1=(Node*)malloc(sizeof(Node));//还用p1---方便循环

   if(p1==NULL) exit(-1); 

   p1->data=temp;

   p1->next=NULL; 

   listLength++;//写一个,加一个 

   

   q1->next=p1;//链接

   q1=p1;//q1后移 

   

   scanf("%d",&temp); 

  }getchar();//去掉\n 

  

printf("\n"); 


L listInfo={listHead,listLength};

 

return listInfo;


/******************************************************函数-打印list************************************************/ 

 void printList(Node* li)

 {

   Node* q=li;

   while(q!=NULL)

{

  printf("%5d",q->data);

  q=q->next;

}

printf("\n\n");

 } 



/***********************************************函数-拼接俩表***************************************************

这类过程 指针变量比较多的过程---建议先大体上写下再用实例来完善

or 直接使用实例 

*/

Node* listCat(L* li1,L* li2)

{    

   Node* head1=li1->listHead;//记录表头,把表2往表1中插

    

   Node* p1=li1->listHead;//p1,p2作为游标指针 

   Node* p2=li2->listHead;

   

   Node* pre_p1=NULL;

   while(p1->next!=NULL && p2!=NULL )

   {

   if(p2->data>p1->data)

   {

     pre_p1=p1;//为p1移动后记录下p1上一个节点位置 

p1=p1->next;

 

}

if(p2->data<=p1->data)

{  

  Node* q=p2->next;//

if(p1==li1->listHead)

             

//printf("插入的节点是表头\n");  

 head1=p2;//更换表头

 p2->next=p1;

 

 p2=q;  

}else{

//printf("222222 插入的节点不是表头\n");

p2->next=p1;

pre_p1->next=p2;

p2=q;//q2后移 

}

}   

   }

   

   while(p1->next==NULL&&p2!=NULL)//不是 p1->next==NULL&&p2!=NULL

   {  

     p1->next=p2;

   }

   

   //while(p2==NULL&&p1!=NULL){}

   return head1;

}

/*************************************************************************/ 

int main()

{/***************************************************建表********************************************/


    printf("\n!!!int按 小->大 输入\nlistSort()更新中......\n\n\n");    

    L list1=arrBuild();

printf(">>>表1为:"); 

    printList(list1.listHead);

 

    L list2=arrBuild();

    printf(">>>表2为:"); 

    printList(list2.listHead);

    

Node* list3=listCat(&list1,&list2);

printf("拼接后的新表为:"); 

printList(list3); 

    /*****************************************************************/

getchar ();

return 0;

}

 

  •  
阅读全文
0 0