合并链表

今天在这里得好好感谢下魔人大哥,他说写程序得闲自己写不能看着书,那样影响自己的思路,果然啊我照着书的算法是实现不了下面这样的结果的,还是自己想了想才做出来。。。。。。。。

 

真的很感谢他。。。。。。

 

#include "stdio.h"
#include "windows.h"

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int *Charme;


////////////////////////////////////////
//定义一个链表
////////////////////////////////////////
typedef struct ListNode
{
Charme data;
struct ListNode *next;

}ListNode,*LinkList;

 


////////////////////////////////////////
//创建链表
////////////////////////////////////////
LinkList CreateList_l(int n)
{


LinkList l=(LinkList)malloc(sizeof(ListNode));//生成新结点

 

LinkList p=l;

for (int i=n;i>0;--i)
{
   //printf("请输入元素\n");
   scanf("%d",&p->data);

 

   if (i>1)
   {
    p=p->next=(LinkList)malloc(sizeof(ListNode));
    p->next=NULL;
   }
   else
   {
    p->next=NULL;
   }
}

return l;
}

/////////////////////////////////////////////
//合并链表
/////////////////////////////////////////////
LinkList MergerList(LinkList la,LinkList lb,LinkList lc)
{
//单链表la lb是按非递减排列的
//合并后的LC也是非递减的
LinkList pa=la->next;
LinkList pb=lb->next;

LinkList pc=lc=la;//把A的头结点作为C的头结点

while (pa&&pb)
{


      if (pa->data<pb->data)
    {
    pc->next=pa;
    pc=pa;
    pa=pa->next;
   
    }
      else
    {
    pc->next=pb;
    pc=pb;
    pb=pb->next;
    pa=pa->next;//这一句书上没有,自己想想就知道了,不能全信书啊
    }

}

pc->next=pa?pa:pb;

free(lb);

return lc;


}


///////////////////////////////////////
//显示链表内容
///////////////////////////////////////
void PrintList(LinkList p,int n)
{

for(int i=0;i<n;i++)
{
   printf("%d->",p->data);
   p=p->next;
}

}


/////////////////////////////////////////
//计算链表长度
/////////////////////////////////////////
int GetLength_l(LinkList l)
{
int cnt=1;
LinkList tmp=l;

while(tmp->next !=NULL)
{
   tmp=tmp->next;
   cnt++;
}

return cnt;
}


int main()
{
//先创建链表
printf("输入A链表的元素(4个元素)\n");

LinkList la=CreateList_l(4);

 


printf("输入B链表的元素(6个元素)\n");

LinkList lb=CreateList_l(6);

 


//合并链表
LinkList lc=(LinkList)malloc(sizeof(ListNode));
LinkList c=MergerList(la,lb,lc);

 

if (c!=NULL)
{
   PrintList(c,GetLength_l(c));

}
else
{
   printf("合并失败");
}


return 0;


}

posted on 2009-06-21 20:55 彭洲 阅读(429) 评论(1) 编辑 收藏

导航

统计

公告