目录
2. main()
int main()
{
LinkList LL; // 声明链表指针变量
LL = NULL;
// 初始化链表
LL = InitList1();
cout << "LL = " << LL << endl;
//InitList3(LL); // C++引用
//cout << "LL = " << LL << endl;
ElemType ee;
LinkList La, Lb, Lc;
//InitList3(La);
La = InitList1();
Lb = InitList1();
Lc = InitList1();
// 创建链表:先插入
ee = 1; InsertList(Lb, 1,&ee);
ee = 2; InsertList(La,1,&ee);
PrintList(La); PrintList(Lb);
// 尾插法
//ee = 1; PushBack(Lb, &ee);
//ee = 2; PushBack(La, &ee);
ee = 3; PushBack(Lb, &ee);
ee = 4; PushBack(Lb, &ee);
ee = 5; PushBack(La, &ee);
ee = 6; PushBack(Lb, &ee);
ee = 7; PushBack(Lb, &ee);
ee = 8; PushBack(Lb, &ee);
ee = 9; PushBack(La, &ee);
ee = 10; PushBack(La, &ee);
//cout << "La = " << PrintList(La) << endl; // 错误
cout << "La = "; PrintList(La);
cout << "Lb = "; PrintList(Lb);
//MergeList(La,Lb,Lc);
//cout << "合并La、Lb -> Lc = ";
//PrintList(Lc);
MergeList2(La, Lb, Lc);
//PrintList(Lb); // MergeList2()中 delete Lb;再次打印会报错
cout << "合并La、Lb -> Lc = ";
PrintList(Lc);
system("pause");
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
typedef int ElemType; // 自定义链表的数据元素为整数。
typedef struct LNode
{
ElemType data; // 存放结点的数据元素。
struct LNode* next; // 指向下一个结点的指针。
}LNode, * LinkList;
//插入
int InsertList(LinkList LL, unsigned int ii, ElemType* ee)
{
if (LL == NULL || ee == NULL)
{
cout << "链表LL或元素ee不存在" << endl;
return 0;
}
// 位置不合法
if (ii < 1)
{
cout << "插入位置不合法" << endl;
return 0;
}
// 要在位序ii插入结点,必须找到ii-1结点。
LNode* pp = LL; //指针pp指向头结点,逐步往后移动,如果为空,表示后面没结点了。
int kk = 0; //kk指向的是第几个结点,从头结点0开始,pp每向后移动一次,kk就加1。
while (pp != NULL && kk < ii - 1) // 找到 ii-1 节点 pp (重点)
{
pp = pp->next;
kk++;
}
if (pp == NULL)
{
cout << "位置不合法,超过了表长:" << endl;
return 0;
}
LNode* tmp = new LNode;
if (tmp == NULL) { return 0; }
memcpy(&tmp->data, ee, sizeof(ElemType)); // 如何实现C++风格?
//cout << "测试:" << tmp->data << endl;
tmp->next = pp->next;
pp->next = tmp;
return 1;
}
// 初始化链表LL,返回值:失败返回NULL,成功返回头结点的地址。
LNode* InitList1()
{
LNode* head = (LNode*)malloc(sizeof(LNode)); // 分配头结点。
if (head == NULL) return NULL; // 内存不足,返回失败。
head->next = NULL; // 头结点的下一结点暂时不存在,置空。
return head;
}
// 初始化:C++ 引用方式
int InitList3(LinkList& LL)
{
if (LL != NULL) { printf("链表L已存在,在初始化之前请先释放它。\n"); return 0; }
//LNode* head = (LNode*)malloc(sizeof(LNode)); // 分配头结点。
LNode* head = new LNode; // C++分配头结点。
if (head == NULL) return 0; // 内存不足,返回失败。
head->next = NULL; // 头结点的下一结点暂时不存在,置空。
LL = head;
return 1;
}
// 在链表LL的尾部插入元素ee,返回值:0-失败;1-成功
int PushBack(LinkList LL, ElemType* ee)
{
if (LL == NULL || ee == NULL)
{
printf("链表LL或元素ee不存在。\n");
return 0;
}
LNode* pp = LL;
// 找到最后一个结点
while ( pp->next != NULL )
{
pp = pp->next;
}
// 找到后插入
LNode* tmp = new LNode;
memcpy(&tmp->data, ee, sizeof(ElemType));
pp->next = tmp;
tmp->next = NULL;
return 1;
}
int MergeList(LinkList La, LinkList Lb, LinkList Lc)
{
if ((La == NULL) || (Lb == NULL) || (Lc == NULL)) { printf("表La、Lb、Lc至少有一个不存在。\n"); return 0; }
La = La->next;
Lb = Lb->next;
LNode* pp;
while ( La!=NULL && Lb!=NULL )
{
if (La->data < Lb->data)
{
pp = La;
La = La->next;
//Lc->next = new LNode;
//Lc = Lc->next;
//memcpy(&Lc->data, &pp->data, sizeof(ElemType)); // Lc
//Lc->next = NULL;
}
else
{
pp = Lb;
Lb = Lb->next;
//Lc->next = new LNode;
//Lc = Lc->next;
//memcpy(&Lc->data, &pp->data, sizeof(ElemType)); // Lc
//Lc->next = NULL;
}
Lc->next = new LNode;
Lc = Lc->next;
memcpy(&Lc->data,&pp->data, sizeof(ElemType)); // Lc
Lc->next = NULL;
}
while (La != NULL)
{
Lc->next = new LNode;
Lc = Lc->next;
memcpy(&Lc->data, &La->data, sizeof(ElemType));
Lc->next = NULL;
La = La->next;
}
while (Lb != NULL)
{
Lc->next = (LNode*)malloc(sizeof(LNode)); // 分配一个新结点。
Lc = Lc->next;
memcpy(&Lc->data, &Lb->data, sizeof(ElemType));
Lc->next = NULL;
Lb = Lb->next;
}
return 1;
}
// 在链表La上操作
int MergeList2(LinkList &La, LinkList &Lb, LinkList &Lc)
{
LinkList pa = La->next;
LinkList pb = Lb->next;
LinkList pc = Lc = La;
while (pa!=NULL && pb != NULL)
{
if (pa->data < pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
//if(pa->next){ pc->next = pa; }else{ pc->next = pb; }
pc->next = pa ? pa : pb;
//delete Lb;
return 1;
}
void PrintList(LinkList LL)
{
if (LL == NULL)
{
cout << "链表LL不存在" << endl;
return;
}
LNode* pp = LL->next; // 从第1个结点开始
while (pp != NULL)
{
cout << pp->data << " ";
pp = pp->next;
}
cout << endl;
}
int main()
{
LinkList LL; // 声明链表指针变量
LL = NULL;
// 初始化链表
LL = InitList1();
cout << "LL = " << LL << endl;
//InitList3(LL); // C++引用
//cout << "LL = " << LL << endl;
ElemType ee;
LinkList La, Lb, Lc;
//InitList3(La);
La = InitList1();
Lb = InitList1();
Lc = InitList1();
// 创建链表:先插入
ee = 1; InsertList(Lb, 1,&ee);
ee = 2; InsertList(La,1,&ee);
PrintList(La); PrintList(Lb);
// 尾插法
//ee = 1; PushBack(Lb, &ee);
//ee = 2; PushBack(La, &ee);
ee = 3; PushBack(Lb, &ee);
ee = 4; PushBack(Lb, &ee);
ee = 5; PushBack(La, &ee);
ee = 6; PushBack(Lb, &ee);
ee = 7; PushBack(Lb, &ee);
ee = 8; PushBack(Lb, &ee);
ee = 9; PushBack(La, &ee);
ee = 10; PushBack(La, &ee);
//cout << "La = " << PrintList(La) << endl; // 错误
cout << "La = "; PrintList(La);
cout << "Lb = "; PrintList(Lb);
//MergeList(La,Lb,Lc);
//cout << "合并La、Lb -> Lc = ";
//PrintList(Lc);
MergeList2(La, Lb, Lc);
//PrintList(Lb); // MergeList2()中 delete Lb;再次打印会报错
cout << "合并La、Lb -> Lc = ";
PrintList(Lc);
system("pause");
return 0;
}