1   1  /  1  页   跳转

[版聊] 合并链表

合并链表

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

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

#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;

}

用户系统信息:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 551; .NET CLR 2.0.50727)
分享到:
gototop
 

回复 2F 地区性 的帖子

纯C
gototop
 
1   1  /  1  页   跳转
页面顶部
Powered by Discuz!NT