数据结构之单链表(C++版)

#include <iostream>
#include <stdlib.h>
using namespace std;
typedef string ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode, *SLink;

void InitList(SLink &L);
void LocateElem(SLink L);
void ListInsert(SLink &L);
void ListDelete(SLink &L);
void DestroyList(SLink &L);
void ListLength(SLink L);
void ListEmpty(SLink L);
void GetElem(SLink L);
void MergeList_L();

int main(void)
{
SLink L;
L = NULL;
int z;
cout << "+---------------------------+ ";
cout << "|----------单链表-----------| " ;
cout << "+---------------------------+ ";
cout << "提示:为保证您的操作得到保存,请按正常顺序退出系统^_^ ";
do
{
cout << ' ' << ' ' << ' ' << ' ' <<"-------------------------------- ";
cout << ' ' << ' ' << ' ' <<"+ 主菜单 | ";
cout << ' ' << ' ' << ' ' <<"+-------------------------------- ";
cout << ' ' << ' ' << ' ' <<"+ [1]----单链表初始化 | ";
cout << ' ' << ' ' << ' ' <<"+ [2]----单链表的定位 | ";
cout << ' ' << ' ' << ' ' <<"+ [3]----单链表的插入 | ";
cout << ' ' << ' ' << ' ' <<"+ [4]----单链表的删除 | ";
cout << ' ' << ' ' << ' ' <<"+ [5]----单链表的销毁 | ";
cout << ' ' << ' ' << ' ' <<"+ [6]----单链表求表长 | ";
cout << ' ' << ' ' << ' ' <<"+ [7]----单链表的判空 | ";
cout << ' ' << ' ' << ' ' <<"+ [8]----单链表的存取 | ";
cout << ' ' << ' ' << ' ' <<"+ [9]----单链表的归并 | ";
cout << ' ' << ' ' << ' ' <<"+ [0]----退出系统 | ";
cout << ' ' << ' ' << ' ' <<"-------------------------------- ";
cout << "请输入您的选择:";
cin >> z;
switch(z)
{
case 0 : break;
case 1 : InitList(L);break;
case 2 : LocateElem(L);break;
case 3 : ListInsert(L);break;
case 4 : ListDelete(L);break;
case 5 : DestroyList(L);break;
case 6 : ListLength(L);break;
case 7 : ListEmpty(L);break;
case 8 : GetElem(L);break;
case 9 : MergeList_L();break;
default:cout << "无效选项!" << ' ';system("pause");
}
}
while(z!= 0);
}


//尾插法初始化建立单链表
void InitList(SLink &L){
SLink p, r;
int n, j;
cout << "请输入单链表元素个数:";
cin >> n;
//创建一个带头节点的空链表,L为指向头节点的指针(头指针)
L = (SLink) malloc (sizeof(LNode));
r = L;
if(!L) exit(0); //存储空间分配失败
cout << "请输入单链表的元素:";
for(j = 0; j < n; j++)
{
p = (SLink) malloc (sizeof(LNode)); //生成新节点
cin >> p->data; //输入元素值
r->next = p; r = p; //插入到表头
}
r->next = NULL;
system("pause");
}//InitList

void LocateElem(SLink L)
{
SLink p;
ElemType e;
int j = 0;
if(L == NULL)
{
cout << "链表不存在,请选择1初始化创建链表 ";
system("pause");
return;
}
p = L;
cout << "请输入要查找的元素:";
cin >> e;
while(p && p->data != e)
{
j++;
p = p->next;
}

if(p) cout << "所找元素的位置为:" << j; //找到满足判定条件的数据元素为第j个元素
else cout << "所找的元素不存在"; //该单链表中不存在满足判定的数据元素
cout << ' ';
system("pause");
}//LocateElem

void ListInsert(SLink &L)
{
//在单链表L的第pos个元素之前插入元素e,输出插入元素后的单链表
SLink p, s, q;
int pos, j;
ElemType e;
if(L == NULL)
{
cout << "链表不存在,请选择1初始化创建链表" << ' ';
system("pause");
return;
}
p = L; j = 0;
cout << "请输入插入节点的位置及插入的元素:";
cin >> pos >> e;

while(p &&j < pos - 1)
{ //查找第pos - 1个节点,并令指针p指向该节点
p = p->next; ++j;
}//while
if(!p || j > pos - 1)
{
cout << "参数不合法,pos小于1或者大于表长加1 "; //参数不合法,pos小于1或者大于表长加1
system("pause");
return;
}
s = new LNode;
if(!s) exit(1); //存储空间失败
s->data = e; //创建新元素节点
s->next = p->next; p->next = s; //修改指针
cout << "插入后的单链表:";
q = L->next;
while(q)
{
cout << q->data << ' ';
q = q->next;
}
cout << ' ';
system("pause");
}//ListInsert

void ListDelete(SLink &L)
{
//删除单链表L的第pos个元素元素,输出删除元素后的顺序表
SLink p, q, r;
int pos, j;
if(L == NULL)
{
cout << "链表不存在,请选择1初始化创建链表 ";
system("pause");
return;
}
cout << "请输入删除节点的位置:";
cin >> pos;
p = L; j = 0;
while(p ->next &&j < pos - 1)
{ //寻找第pos个节点,并令指针p指向其前驱
p = p->next; ++j;
}//while
if(!(p->next) || j > pos - 1)
{
cout << "删除位置不合法"; //删除位置不合法
system("pause");
return;
}
q = p->next; p->next = q->next; //修改指针
delete(q); //释放节点空间
cout << "删除后的单链表:";
r = L->next;
while(r)
{
cout << r->data << ' ';
r = r->next;
}
cout << ' ';
system("pause");
}//ListDelete

void DestroyList(SLink &L)
{
if(L == NULL)
{
cout << "链表不存在,请选择1初始化创建链表 ";
system("pause");
return;
}
//销毁以L为头指针的单链表,释放链表中所有节点的空间
SLink p;
while(L)
{
p = L;
L = L->next;
delete p;
}//while
L = NULL; //虽然头节点占有的空间已经释放,但指针变量L中的值没有改变,为安全起见,置L为空,以防止对系统空间的访问
cout << "链表已销毁" << ' ';
system("pause");
}//DestroyList


void ListLength(SLink L)
{
SLink p;
p = L;
int j;
j = 0;
if(p == NULL)
{
cout << "链表不存在,请选择1初始化创建链表 ";
system("pause");
return;
}
while(p)
{
p = p->next;
j++;
}
cout << "单链表表长为:" << j - 1 << ' ';
system("pause");
}

void ListEmpty(SLink L)
{
if(L == NULL)
{
cout << "链表不存在,请选择1初始化创建链表 ";
system("pause");
return;
}
if(L->next == NULL)
cout << "该单链表表为空 ";
else
cout << "该单链表不为空 ";
system("pause");
}

void GetElem(SLink L)
{
//若1 <= pos <= lengthList(L),则用e带回指针L指向头节点的单链表中第pos个元素的值且返回函数的值为TRUE,否则返回的值为FALSE
SLink p;
ElemType e;
int pos, j;
if(L == NULL)
{
cout << "链表不存在,请选择1初始化创建链表 ";
system("pause");
return;
}
cout << "取出单链表元素的位置:";
cin >> pos;
p = L->next; //变量初始化,p指向第一个节点
j = 1;
while(p && j < pos)
{ //顺节点的指针向后查找,直至p指到第pos个节点或p为空止
p = p->next;
++j;
}//while
if(!p || j > pos)
{
cout << "链表中不存在第pos个节点 "; //链表中不存在第pos个节点
system("pause");
return;
}
e = p->data; //取到第pos个元素
cout << "取出的元素为:" << e << ' ';
system("pause");
}//GetElem

void MergeList_L()
{
//按值排序的单链表La,Lb,归并为Lc后也按值排序
SLink La, Lb, Lc, pa, pb, pc, ra, rb, q;
int m, n, j;
cout << "请输入单链表La元素个数:";
cin >> m;
La = new LNode;
ra = La;
if(!La) exit(0); //存储空间分配失败
cout << "请输入单链表La的元素:";
for(j = 0; j < m; j++)
{
pa = new LNode; //生成新节点
cin >> pa->data; //输入元素值
ra->next = pa; ra = pa; //插入到表头
}
ra->next = NULL;
cout << "请输入单链表Lb元素个数:";
cin >> n;
Lb = new LNode;
rb = Lb;
if(!Lb) exit(0); //存储空间分配失败
cout << "请输入单链表Lb的元素:";
for(j = 0; j < n; j++)
{
pb = new LNode; //生成新节点
cin >> pb->data; //输入元素值
rb->next = pb; rb = pb; //插入到表头
}
rb->next = NULL;
pa = La->next; pb = Lb->next; Lc = pc = La; q = Lc->next;
while(pa && pb) //将pa,pb节点按大小一次插入c中
{
if(pa->data <= pb->data)
{
pc->next = pa; pc = pa; pa = pa->next;
}
else
{
pc->next = pb; pc = pb; pb = pb->next;
}
}
pc->next = pa ? pa : pb;

delete Lb; //释放Lb头节点
j = 0;
while(j < m + n)
{
cout << q->data << ' ';
q = q->next;
j++;
}
cout << ' ';
system("pause");
}//MergeList_L

原文地址:https://www.cnblogs.com/wwttsqt/p/7783179.html