c++ 单链表的基本操作(增删改查,前插,后插法,逆置等等)
#include <iostream>
using namespace std;
typedef int ElemType;
// 单链表的存储结构
typedef struct LNode
{
ElemType data;
struct LNode* next;
} LNode, * LinkList;
LNode* initList(LinkList& L);
LNode* createList(LinkList& L);
void printLinkList(LinkList& L);
int getlenLinkList(LinkList& L);
bool insertLinkList(LinkList& L);
bool deleteLinkList(LinkList& L);
bool InsertNextNode(LNode* p, ElemType e);
bool InsertPriorNode(LNode* p, ElemType e);
bool ModifyNode(LinkList& L);
bool lookValue(LinkList& L);
void reverseLinkList(LinkList L);
void reverseLinkList2(LinkList L);
int main()
{
LinkList L;
createList(L);
insertLinkList( L);
deleteLinkList( L);
ModifyNode(L);
lookValue(L);
reverseLinkList(L);
//reverseLinkList2(L);
system("pause");
return 0;
}
//单链表的初始化
LNode* initList(LinkList& L)
{
L = new LNode;
L->next = NULL;
return L;
}
//单链表的创建
LNode* createList(LinkList& L)
{
int len;
cout << "请输入创建单链表元素个数:" << endl;
cin >> len;
L = initList(L);
LNode* r,*s;
ElemType e;
r = L;
cout << "请依次输入"<<len<<"个元素:" << endl;
for (int i = 0; i < len; i++)
{
cin >> e;
s = new LNode;
s->data = e;
s->next = NULL;
r->next = s;
r = r->next;
}
printLinkList(L);
return L;
}
//显示当前单链表所有元素
void printLinkList(LinkList& L)
{
LNode* p = L->next;
cout << "当前所有元素为:" << endl;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//获取单链表长度
int getlenLinkList(LinkList& L)
{
LNode* p = L->next;
int len=0;
while (p)
{
p = p->next;
len++;
}
return len;
}
//将元素插入指定位置
bool insertLinkList(LinkList& L)
{
cout << "请输入需要插入元素位置" << endl;
int i;
ElemType e;
cin >> i;
if (i<1 || i>getlenLinkList(L)+1)
{
cout << "输入数据有误:" << endl;
return false;
}
cout << "请输入插入元素 " << endl;
cin >> e;
LNode* p;
int j = 0;
p = L;
while ( j < i - 1)
{
p = p->next;
j++;
}
InsertNextNode( p, e);
printLinkList(L);
return true;
}
//指定节点后插操作
bool InsertNextNode(LNode* p, ElemType e)
{
if (p == NULL)
return false;
LNode* n = new LNode;
n->data = e;
n->next = p->next;
p->next = n;
return true;
}
//指定节点前插操作
bool InsertPriorNode(LNode* p, ElemType e)
{
if (p == NULL)
return false;
LNode* n = new LNode;
n->data = p->data;
n->next = p->next;
p->next = n;
p->data = e;
return true;
}
//删除指定位置元素
bool deleteLinkList(LinkList& L)
{
cout << "请输入需要删除元素位置" << endl;
int i;
cin >> i;
if (i<1 || i>getlenLinkList(L))
{
cout << "输入数据有误:" << endl;
return false;
}
int j = 0;
LNode* p = L;
while (j < i - 1)
{
p = p->next;
j++;
}
LNode* q = p->next;
p->next = q->next;
ElemType e = q->data;
free(q);
cout << "已经成功删除第"<<i<<"个位置上元素" << e << endl;
printLinkList(L);
return true;
}
//修改指定位置元素
bool ModifyNode(LinkList& L)
{
cout << "请输入需要修改元素位置" << endl;
int i;
cin >> i;
if (i<1 || i>getlenLinkList(L))
{
cout << "输入数据有误:" << endl;
return false;
}
int j = 0;
ElemType e;
cout << "请输入该位置修改元素 " << endl;
cin >> e;
LNode* p = L;
while (j < i)
{
p = p->next;
j++;
}
p->data = e;
printLinkList(L);
return true;
}
//按值查找单链表中元素
bool lookValue(LinkList& L)
{
LNode* p;
ElemType e;
cout << "输入查找元素 " << endl;
cin >> e;
p = L->next;
int j =1;
while (p)
{
if (p->data == e)
{
cout << "查找的元素" << e << "在第" << j << "个位置" << endl;
return true;
}
p = p->next;
j++;
}
cout << "该元素不存在 " << endl;
return false;
}
//转置单链表(置换原来的链表)
void reverseLinkList(LinkList L)
{
LNode*r,* p, * q;//尾指针,插入指针,遍历指针
r = L->next;
p= q = r->next;
r->next = NULL;
while (q)
{
q = q->next;
p->next = r;
L->next = p;
r = p;
p = q;
}
cout << "转置后的所有元素为:" << endl;
while (r)
{
cout << r->data << " ";
r = r->next;
}
cout << endl;
}
//转置链表(方法2建立一个新链表)
void reverseLinkList2(LinkList L)
{
LinkList L2;
L2 = new LNode;
L2->next = NULL;
LNode* p, * q;
q = L->next;
p = L2->next;
while (q)
{
p = new LNode;
p->data = q->data;
p->next = L2->next;
L2->next = p;
q = q->next;
}
cout << "转置后的所有元素为:" << endl;
while (p)
{
cout << p->data << " ";
p =p->next;
}
cout << endl;
}