链表的生成与合并
来源:互联网 发布: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");
}
- 链表的生成与合并
- 链表的合并与排序
- 链表的合并与反转
- excel的生成与表头的合并的一个例子
- 第二章 线性表(链表的建立与合并)
- 链表的合并
- 链表的合并
- 链表的合并
- 24.链表的逆置与合并
- Linkedlist 索引+链表的合并与删除
- 合并两个有序链表的递归与非递归
- 逆转交替合并两个链表的解析与实现
- 两个有序链表的合并与交集
- Android 中Odex文件生成与合并
- Android 中Odex文件生成与合并
- 合并查询结果 与 表的别名
- 合并有序的链表
- 链表的合并 源码
- Windows Mobile触摸屏(Touch Panel)截获(手写)
- 关于Config.bib中,内存分配问题KN,RAM
- 第四回:顶点渲染
- 预编译头文件
- Platform Builder之旅(三)
- 链表的生成与合并
- 面向对象
- ucos在lpc上的移植心得
- IP地址基础知识
- [总结]C#判断一个string是否可以为数字,五种解决方案!
- Linux RPM 命令参数使用详解
- 【广告】在flash上加一个超级连接
- jboss tomcat weblogic websphere 性能对比测试
- 实例学习(上下级类别判断)