链表的生成与合并

来源:互联网 发布:web前端书籍推荐 知乎 编辑:程序博客网 时间:2024/06/16 13:45

一个很经典的链表程序,在笔试中经常会考到这个题目。

 

#include <stdio.h>
#include <windows.h>

// 链表定义
typedef struct LNode{
 int  data;
 LNode *next;
}LNode, *LinkList;

//
// 函数声明
//
void  CreateList(LinkList &L);
int   GetElem(LinkList L, int i);
LinkList MergeList(LinkList L1,LinkList L2);
void  SortList(LinkList &L,BOOL flag);
void  PrintList(const LinkList &L);

int main()
{
 LinkList L1;
 LinkList L2;

 printf("第一个链表:/n");
 CreateList(L1);
 PrintList(L1);

 printf("第二个链表:/n");
 CreateList(L2);
 PrintList(L2);

 printf("合并后的链表:/n");
 LinkList L = MergeList(L1,L2);
 PrintList(L);

 return 0;
}

//
// 创建链表L(遇到-1时结束)
//
void CreateList(LinkList &L)
{
 LinkList head;
 LinkList p;
 // 建立第一个结点
 L = (LinkList)malloc(sizeof(LNode));
 L->next = NULL;
 scanf("%d",&L->data);
 // 保存头结点
 head = L;

 int iData;
 while (TRUE)
 {
  scanf("%d",&iData);
  if (iData == -1)
   break;

  // 建立一个结点p
  p = (LinkList)malloc(sizeof(LNode));
  p->data = iData;
  p->next = NULL;

  // 把L指针指向结点p
  L->next = p;
  L = L->next;
 }
 // 把指针移动到头结点
 L = head;
}

//
// 提取出链表L中第i个结点的值
//
int GetElem(LinkList L, int i)
{
 LinkList p;
 int j = 1;

 p = L;
 while (p && (j < i))
 {
  p = p->next;
  ++j;
 }
 if ((!p) || (j>i))
 {
  return -1;
 }

 return (p->data);
}

//
// 合并链表L1和L2(递归法)
//
LinkList MergeList(LinkList L1,LinkList L2)
{
 if(L1 == NULL)
 {
  return L2;
 }
 if(L2 == NULL)
 {
  return L1;
 }

 LinkList head;

 if(L1->data <= L2->data)
 {
  head = L1;
  head->next = MergeList(L1->next,L2);
 }
 else
 {
  head = L2;
  head->next = MergeList(L1,L2->next);
 }

 return head;
}
//
// 合并链表L1和L2(非递归)
//
/*
LinkList MergeList(LinkList L1,LinkList L2)
{
 if(L1 == NULL)
 {
  return L2;
 }
 if(L2 == NULL)
 {
  return L1;
 }

 LinkList head;
 LinkList p1,p2;
 if(L1->data <= L2->data)
 {
  head = L1;
  p1 = L1->next;
  p2 = L2;
 }
 else
 {
  head = L2;
  p1 = L1;
  p2 = L2->next;
 }

 LinkList pCurrent;
 pCurrent = head;

 while((p1 != NULL) && (p2 != NULL))
 {
  if(p1->data <= p2->data)
  {
   pCurrent->next = p1;
   pCurrent = p1;
   p1 = p1->next;
  }
  else
  {
   pCurrent->next = p2;
   pCurrent = p2;
   p2 = p2->next;
  }
 }

 if(p1 != NULL)
 {
  pCurrent->next = p1;
 }
 if(p2 != NULL)
 {
  pCurrent->next = p2;
 }

 return head;
}
*/

//
// 输出链表的所有结点
//
void PrintList(const LinkList &L)
{
 LinkList p;
 p = L;

 while(p)
 {
  printf("%d -> ",p->data);
  p = p->next;
 }

 printf("NULL/n");
}