#include <iostream>
using namespace std;
#define OK 1;
#define ERROR 0;
typedef int Status;
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
Status InitList(LinkList& L);
void CreateList_H(LinkList& L, int n);
void CreateList_R(LinkList& L, int n);
void TraverseList(LinkList L);
void Connect(LinkList& L, LinkList& Q,LinkList& C);
void Connect2(LinkList& L, LinkList& Q, LinkList& C);
Status GetElem(LinkList L, int i, ElemType& e);
int LocateElem(LinkList L, ElemType);
Status ListInsert(LinkList& L, int i, ElemType e);
Status ListDelete(LinkList& L, int i);
int main(int argc, char** argv) {
LinkList L;
LinkList Q;
LinkList C;
int n, i, choice = 1;
ElemType e, value;
InitList(L);
cout <<"《第三次作业(关于单链表的练习)》"<<endl
<<" "<<endl
<< "输入对应序号使用功能:" << endl
<< "①.创建链表" << endl
<< "②.遍历链表" << endl
<< "③.按位查询" << endl
<< "④.按值查询" << endl
<< "⑤.按位插入" << endl
<< "⑥.按位删除" << endl
<< "⑦.合并链表(重复有删除)" << endl
<< "⑧.合并链表(重复无删除)" << endl
<< "<0>.退出" << endl
<< "--------------------" << endl;
while (choice) {
cout << "请输入你要进行的操作:\t";
cin >> choice;
if (choice > 8)cout << "Sorry,your input is wrong!" << endl;
switch (choice) {
case 1://后插法创建单链表
cout << "你想创建单链表的表长为:";
cin >> n;
CreateList_R(L, n);
break;
case 2://遍历
if (!L->next) {
cout << "还未创建单链表,查询失败!" << endl;
break;
}
TraverseList(L);
break;
case 3://按位查询
if (!L->next) {
cout << "还未创建单链表,查询失败!" << endl;
break;
}
cout << "你想查询的位置i是:";
cin >> i;
if (GetElem(L, i, e))
cout << "它的位置是:" << e << endl;
else
cout << "查询失败!" <<endl;
break;
case 4://按值查询
if (!L->next) {
cout << "还未创建单链表,查询失败!" << endl;
break;
}
cout << "你想查询的值为:";
cin >> value;
if (LocateElem(L, value))
cout << "它的位置是:" << LocateElem(L, value) << endl;
else
cout << "查找不到" << endl;
break;
case 5://插入
if (!L->next) {
cout << "还未创建单链表,查询失败!" << endl;
break;
}
cout << "你想插入的位置和数字是:";
cin >> i >> e;
if (ListInsert(L, i, e))cout << "插入成功!";
else cout << "输入位置不合法!";
break;
case 6://删除
if (!L->next) {
cout << "还未创建单链表,查询失败!" << endl;
break;
}
cout << "你想删除的位置i是:";
cin >> i;
if (ListDelete(L, i))
cout << "删除成功!" << endl;
else
cout << "删除失败,删除位置不合法!";
break;
case 7://合并 有删
if (!L->next) {
cout << "还未创建单链表,查询失败!" << endl;
break;
}
cout << "请输入第二个单链表的表长" << endl;
cin >> n;
CreateList_R(Q, n);
Connect(L,Q,C);
cout << endl ;
break;
case 8://合并 有删
if (!L->next) {
cout << "还未创建单链表,查询失败!" << endl;
break;
}
cout << "请输入第二个单链表的表长" << endl;
cin >> n;
CreateList_R(Q, n);
Connect2(L, Q, C);
cout << endl;
break;
case 0:
cout << "结束!" << endl;
return 0;
}
}
return 0;
}
Status InitList(LinkList& L) {
L = new LNode;
L->next = NULL;
return 1;
}
Status InitList2(LinkList& Q) {
Q = new LNode;
Q->next = NULL;
return 1;
}
void CreateList_H(LinkList& L, int n) {
L = new LNode;
L->next = NULL;
for (int i = 0; i < n; i++) {
LinkList p;
p = new LNode;
cout << "请输入第" << n - i << "个数为:";
cin >> p->data;
p->next = L->next;
L->next = p;
}
cout << "前插法创建成功!" << endl;
}
void CreateList_R(LinkList& L, int n) {
L = new LNode;
L->next = NULL;
LinkList p, r;
r = L;
for (int i = 0; i < n; i++) {
p = new LNode;
cout << "请输入第" << i + 1 << "个数为:";
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
cout << "创建成功!" << endl;
}
void TraverseList(LinkList L) {
LinkList p;
p = L;
cout << "遍历结果:";
while (p->next != NULL) {
p = p->next;
cout << p->data << " ";
}
cout << endl;
}
Status GetElem(LinkList L, int i, ElemType& e) {
LinkList p;
p = L;
int j;
for (j = 0; j < i && p; j++)
p = p->next;
if (!p || i < 1)return ERROR;
e = p->data;
return OK;
}
int LocateElem(LinkList L, ElemType e) {
LinkList p = L->next;
int i = 1;
for ( i = 1; p && p->data != e;i++) {
p = p->next;
}
return i;
}
Status ListInsert(LinkList& L, int i, ElemType e) {
LinkList p, q;
p = L;
int j = 0;
q = new LNode;
q->next = NULL;
q->data = e;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p && i < 1)return ERROR;
q->next = p->next;
p->next = q;
return OK;
}
Status ListDelete(LinkList& L, int i) {
LinkList p, q;
p = L;
int j = 0;
while (p->next && j < i - 1)
{
p = p->next;
j++;
}
if (!p->next || i < 1)return ERROR;
q = p->next;
p->next = q->next;
delete q;
return OK;
}
void Connect(LinkList& A,LinkList& B,LinkList& C)
{
LinkList pa, pb, t;
pa = A->next;
pb = B->next;
C = A;
C->next = NULL;
t = C;
while (pa != NULL && pb != NULL)
{
if (pa->data < pb->data)
{
t->next = pa;
t = t->next;
pa = pa->next;
}
else if (pa->data > pb->data)
{
t->next = pb;
t = t->next;
pb = pb->next;
}
else
{
t->next = pa;
t = t->next;
pa = pa->next;
pb = pb->next;
}
}
if (pa == NULL) {
t->next = pb;
}
if (pb == NULL) {
t->next = pa;
}
cout << "合并结果:";
while (C->next != NULL)
{
C = C->next;
cout << C->data << " ";
}
}
void Connect2(LinkList& A, LinkList& B, LinkList& C)
{
LinkList pa, pb, t;
pa = A->next;
pb = B->next;
C = A;
C->next = NULL;
t = C;
while (pa != NULL && pb != NULL)
{
if (pa->data <= pb->data)
{
t->next = pa;
t = t->next;
pa = pa->next;
}
else if (pa->data > pb->data)
{
t->next = pb;
t = t->next;
pb = pb->next;
}
}
if (pa == NULL) {
t->next = pb;
}
if (pb == NULL) {
t->next = pa;
}
cout << "合并结果:";
while (C->next != NULL)
{
C = C->next;
cout << C->data << " ";
}
}