#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//初始化
//带头结点
void initList(LinkList& L) {
L = new LNode;
L->next = NULL;
}
//头部插入法建表
void InputList_H(LinkList& L, int n) {
//initList(L);
LNode* p;//用于开辟新的结点
for (int i = 0; i < n; i++) {
p = new LNode;
cin >> p->data;
//将新结点插入到头结点后
p->next = L->next;
L->next = p;
}
}//头插法
//尾插法建表
void InputList_R(LinkList& L, int n) {
//initList(L);
LNode* p;//用于开辟新的结点
LNode* r;//用于指向表尾结点
r = L;
for (int i = 0; i < n; i++) {
p = new LNode;
cin >> p->data;
//将新结点插入到表尾后
r->next = p;
r = p;
}
r->next = NULL;
}//头插法
//输出
void ShowList(LinkList L) {
if (L == nullptr) {
cout << "链表未初始化" << endl;
return;
}
LNode* p;
p = L->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
}
//尾部插入
void insertR(LinkList& L) {
LNode* p;
p = new LNode;
p->next = NULL;
cout << "请输入在表尾插入的结点:" << endl;
cin >> p->data;
LNode* r;
r = L;
while (r->next) {//找到尾结点
r = r->next;
}
r->next = p;
}
//表长
int getLength(LinkList L) {
LNode* p = L->next;
int i = 0;
while (p) {
p = p->next;
i++;
}
return i;
}
//读表元
bool GetElem(LinkList L, int i, ElemType& e) {
//L是带头结点的单链表,读L的第i个元素,用e返回其值
LNode* p = L->next;int j = 1; //指针p指向a1
while (p && j < i) { p = p->next; j++; } //指针p右移i-1次
if (!p || j > i)return false; //i非法 !p:i太大,j>i:i太小
e = p->data;
return true;
} //GetElem O(n)
//删除
bool ListDelete(LinkList L, int i, ElemType& e) {
// L是带头结点的单链表,删除ai,用参数e带回被删结点的值
LNode* p = L;int j = 0; //p指向头结点,j是计数器
while (p && j < i - 1) { p = p->next; j++; } //p指向ai-1
if (!p || j > i - 1) return false; // i非法
LNode* q = p->next; e = q->data;
p->next = q->next; free(q); //修改指针
return true;
} // ListInsert O(n)
//插入
bool ListInsert(LinkList& L, int i, ElemType e) {
// L是带头结点的单链表,在ai之前插入新结点e
LNode* p = L; int j = 0; //p指向头结点,j是计数器
while (p && j < i - 1) { p = p->next; j++; }//找指向ai-1的p
if (!p || j > i - 1) return false;//i非法,i大于表长或i<1
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next; p->next = s; //修改指针
return true;
}
//删除某个元素
bool Delete(LinkList& L, ElemType e) {
LNode* p = L->next; LNode* q = L;
while (p && p->data!=e) {
p = p->next;
q = q->next;
}
if (p) {
q->next = p->next;
free(p);
return true;
}
else return false;
}
//合并
void MergeList(LinkList La, LinkList Lb, LinkList& Lc) {
//将有序线性表La和Lb归并成有序线性表Lc
int i, j;
i = j = 1; int k = 0; initList(Lc); //初始化
int ai, bj;
int La_len = getLength(La); int Lb_len = getLength(Lb);//求表长
while (i <= La_len && j <= Lb_len) { //La和Lb均非空
GetElem(La, i,ai); GetElem(Lb, j,bj);//读ai和bj
if (ai <= bj) { ListInsert(Lc, ++k, ai); i++; }
else { ListInsert(Lc, ++k, bj); j++; }
}
while (i <= La_len) { //La中剩余元素一一插入Lc
GetElem(La, i++, ai); ListInsert(Lc, ++k, ai);
}
while (j <= Lb_len) { //Lb中剩余元素一一插入Lc
GetElem(Lb, j++, bj); ListInsert(Lc, ++k, bj);
}
}// MergeList
int main(){
LinkList L = nullptr; int n; ElemType e;
LinkList La, Lb, Lc;
int data;
do {
cout << endl;
cout << "\t 1 单链表的初始化" << endl;
cout << "\t 2 单链表的输入" << endl;
cout << "\t 3 单链表的显示" << endl;
cout << "\t 4 单链表的表长" << endl;
cout << "\t 5 单链表的尾部插入" << endl;
cout << "\t 6 单链表的位置查找" << endl;
cout << "\t 7 单链表的插入" << endl;
cout << "\t 8 单链表的按位置删除" << endl;
cout << "\t 9 单链表中删除某个元素" << endl;
cout << "\t 10 两个有序表的合并" << endl;
cout << "\t 0 退出操作" << endl;
cin >> data;
if (data == 1) initList(L);
else if (data == 2) {
cout << "请输入你要输入的n数:"; cin >> n;
cout << "请输入链式表的数值:";
InputList_R(L, n);
}
else if (data == 3) {
cout << "表中数据:";
ShowList(L);
}
else if (data == 4) {
cout << "表长:" << getLength(L);
}
else if (data == 5) {
insertR(L);
}
else if (data == 6) {
cout << "你想查找的位置:";
cin >> n;
if (GetElem(L, n, e)) cout << "该元素为:" << e;
else cout << "未找到!";
}
else if (data == 7) {
cout << "你想插入的位置和元素:";
cin >> n>>e;
if (ListInsert(L, n, e)) {
cout << "表内元素为:";
ShowList(L);
}
else cout << "插入位置有问题";
}
else if (data == 8) {
cout << "你想删除的位置:";
cin >> n;
if (ListDelete(L, n, e))
cout << "删除的元素是:" << e;
else cout << "输入的位置有误";
}
else if (data == 9) {
cout << "请输入你想要删除的元素:";
cin >> e;
if (Delete(L, e)) {
cout << "删除后的表为:";
ShowList(L);
}
else cout << "未找到该元素!";
}
else if (data == 10) {
initList(La);
initList(Lb);
initList(Lc);
cout << "请输入你要输入的n数:"; cin >> n;
cout << "请输入链式表的数值:";
InputList_R(La, n);
cout << endl;
cout << "请输入你要输入的n数:"; cin >> n;
cout << "请输入链式表的数值:";
InputList_R(Lb, n);
cout << endl;
MergeList(La, Lb, Lc);
cout << "合并后的表为:";
ShowList(Lc);
}
} while (data != 0);
}
单链表的操作
于 2024-12-17 14:33:34 首次发布