实验1 链表的插入和删除
一、【实验目的】
- 了解单链表、循环链表和双链表的基本知识;
- 掌握算法思想和数据结构的描述;
- 掌握链表的插入、删除的相关语句及基本方法。
二、【实验内容】
设有两个无头结点的单链表,分别为ha,hb,其链中有数据域data,链域next,两链表的数据都按递增序存放。现要求将hb表归到ha表中,且归并后ha仍按递增排序,归并中ha表中已有的数据若与hb相同,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏。
#include<iostream>
using namespace std;
typedef struct LNode {
int data;//数据域
LNode* next;//指针域
}LNode,*LinkList;
void CreatList(LinkList& L, int n) {
//从创建一个不带头结点的链表
if (n > 0) {
L = new LNode;
L->next = NULL;//创造一个首元结点
if (n == 1) {
cin >> L->data;//一个元素直接用头指针创造的头结点存
}
else if (n > 1) {
LNode* r = L;//指针r记录最后一个结点所在位置
cin >> r->data;//首元结点数据赋值
for (int i = 0; i < n - 1; i++) {
LNode* p = new LNode;//开辟一个新结点
p->next = NULL;
cin >> p->data;//数据域赋值
r->next = p;//原尾结点指针域指向p
r = p;//尾结点地址r更新
}
}
}
}
void PrintList(LinkList& L) {
//输出链表
LNode* p = L;
while (p) {
cout << p->data << "\t";
p = p->next;
}
cout << endl;
}
void LinkSort(LinkList& L) {
//BubbleSort
LNode* p = L;
int n = 0;
while (p) {//找到链表的长度
p = p->next;
n++;
}
int i, j, temp;
for (i = 0; i < n; i++) {
p = L;//指针归首元结点
for (j = 0; j < n-i-1; j++) {
if (p->data > p->next->data) {//大于就交换值域
temp = p->next->data;
p->next->data = p->data;
p->data = temp;
}
p = p->next;//p指针后移
}
}
}
void AddList(LinkList& La, LinkList& Lb) {//已排序好的Lb插入已排序好的La
LNode* pa = La, * pb = Lb;//pa,pb指向首元
LNode* q = La;//已插入完成部分最后一个数
//首元结点操作
if (La->data > Lb->data) {//如果b的首元小于a,则p存Lb首元,插入La
LNode* p = new LNode;
p->data = pb->data;//存值
p->next = La;//插到la首元前面
La = p;//La指向p,p成为新首元
pb = pb->next;//pb指向下一个结点
}
else {
pa = La->next;//pa未排序指针向前一位
}
while (pb&&pa) {
if (pa->data > pb->data) {
LNode* p = new LNode;
q->next = p;//p接入已排序处
p->data = pb->data;//pb数据录入p
pb = pb->next;//pb向前挪一位
q = q->next;// q向前挪一位
}
if (pa->data < pb->data) {
q->next = pa;//q后接pa的链
pa = pa->next;
q = q->next;//pa和q都向前挪一位
}
if (pa->data == pb->data) {
q->next = pa;//q后接pa的链
pa = pa->next;
pb = pb->next;
q = q->next;//pa,pb和q都向前挪一位
}
}
while (pb) {
LNode* p = new LNode;
q->next = p;//p接入已排序处
p->data = pb->data;//pb数据录入p
pb = pb->next;//pb向前挪一位
q = q->next;// q向前挪一位
}
q->next = NULL;
}
int main() {
int na,nb;
LinkList La, Lb;
cout << "请输入链表La元素个数:" << endl;
cin >> na;
CreatList(La, na);
cout << "请输入链表Lb元素个数:" << endl;
cin >> nb;
CreatList(Lb, nb);
PrintList(La);//测试CreatList
PrintList(Lb);
LinkSort(La);//测试LinkSort
LinkSort(Lb);
cout << "排序后" << endl;
PrintList(La);
PrintList(Lb);
cout << "并入后" << endl;
AddList(La, Lb);
PrintList(La);
PrintList(Lb);
system("pause");
return 0;
}
//3 5 2 3
//4 5 6 4 3