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;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值