C++数据结构之链表
c++链表部分#include<iostream>using namespace std;typedef struct _LinkNode {int data;//节点的数据域struct _LinkNode* next; //结点的指针域}LinkNode,LinkList; //链表节点,链表//构造一个空的单链表bool InitList(LinkList*& L){L
·
c++单链表链表部分
#include<iostream>
using namespace std;
typedef struct _LinkNode {
int data; //节点的数据域
struct _LinkNode* next; //结点的指针域
}LinkNode,LinkList; //链表节点,链表
//构造一个空的单链表
bool InitList(LinkList*& L)
{
L = new LinkNode; //生产新节点作为头节点 用头指针L指向头节点
if (!L)return false; //生成节点失败
L->next = NULL; //头节点的指针域置空
return true;
}
//前插法
bool ListInsert_front(LinkList*& L, LinkNode* Node)
{
if (!L || !Node) return false;
Node->next = L->next;
L->next = Node;
return true;
}
//尾插法
bool ListInsert_back(LinkList*& L, LinkNode* Node)
{
if (!L || !Node) return false;
LinkNode* last = NULL;
//找到最后一个节点
last = L;
while (last->next) last = last->next;
Node->next = NULL;
last->next = Node;
return true;
}
//任意位置插入
bool LinkInsert(LinkList*& L, int i, int& e)
{
//在带头节点的单链表L中的第i个位置插入值为e的新节点
int j;
LinkList* p, * s;
p = L;
j = 0;
while (p && j < i - 1)//查找第i-1个节点,p指向该节点
{
p=p->next;
j++;
}
if (!p || j > i - 1) {
return false;
}
s = new LinkNode; //生产新的节点
s->data = e; //将新节点的数据域置为e
s->next = p->next;//将新节点的指针域指向节点
p->next = s; //将节点p的指针域指向结点s
return true;
}
//单链表的便利
void LinkPrint(LinkList*& L) //单链表的输出
{
LinkNode* p;
p = L->next;
while (p)
{
cout << p->data << "\t";
p = p->next;
}
cout << endl;
}
bool Link_GetElem(LinkList*& L, int i, int& e) //单链表的取值
{
//带头结点的单链表L中查找第i个元素
//用e记录L中第i个数据元素的值
int j;
LinkList* p;
p = L->next; //p指向第一个节点
j = 1;
//顺着链表向后扫描 直到p指向第i个元素
//或者p不存在
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
return false;
}
e = p->data; //取第i个节点的数据域
return true;
}
//单链表中查找元素
bool Link_FindElem(LinkList* L, int e,int &index) //按值查找
{
//在带头结点的单链表中查找值为e的元素
LinkList* p;
p = L->next;
//没有找到就一直往后找
while (p&& p->data != e) {
index++;
p = p->next;
}
//查找失败 p为NULL
if (!p) return false;
return true;
}
//单链表中删除元素
bool LinkDelete(LinkList*& L, int i) {
//在带头结点的单链表L中,删除第i个为位置
LinkList* p,*q;
int j = 1;
p = L->next;
if (!L || !L->next) { return false; }
while (p->next && j < i-1)
{
p = p->next;
j++;
}
if (!p->next || j > i - 1) {
return false;
}
q = p->next;
p->next = q->next;
delete q;//释放被删除节点的空间
return true;
}
void LinkDestroy(LinkList*& L)//单链表的销毁
{
//定义临时节点p指向头节点
LinkList* p = L;
cout << "销毁链表中。。。。。。。。。" << endl;
while (p)
{
L = L->next; //L指向下一个节点
cout << "删除元素:" << p->data << endl;
delete p; //删除当前节点
p = L; //p移向下一个节点
}
}
int main() {
LinkList* L = NULL;
LinkNode* s = NULL;
//1.初始化一个空的链表
InitList(L);
//2.使用前插法插入数据
int n;
cout << "前插法创建单链表" << endl;
cout << "请输入插入元素的个数:";
cin >> n;
while (n--)
{
s = new LinkNode; //生成新节点s
cin >> s->data;
ListInsert_front(L, s);
}
//3. 使用尾插法插入数据
/*int n;
cout<<"尾插法创建单链表"<<endl;
cout<<"请输入元素个数 n:";
cin>>n;
cout<<"\n 请依次输入 n 个元素:" <<endl;
while(n>0){
s = new LinkNode; //生成新节点 s
cin>>s->data;
ListInsert_back(L, s);
n--;
}
*/
//4.单链表的输出
LinkPrint(L);
//5.在任意位置插入元素
for (int j = 0; j < 3; j++) {
int i, x;
cout << "请输入插入的位置和元素(用空格隔开):";
cin >> i;
cin >> x;
if (LinkInsert(L, i, x)) {
cout << "插入成功.\n\n";
} else {
cout << "插入失败!\n\n";
}
LinkPrint(L);
}
//6.单链表根据位置获取元素
int element = 0;
if (Link_GetElem(L, 2, element)) {
cout << "获取第二个元素成功, 值:" << element << endl;
}
else {
cout << "获取第二个元素失败!" << endl;
}
//7. 单链表根据值查询元素所在的位置
int index=0;
if (Link_FindElem(L, 10, index)) {
cout << "查找元素 10 存在,所在位置: " << index << endl;
}
else {
cout << "不存在元素 10." << endl;
}
//8. 单链表删除元素
if(LinkDelete(L, 2)){
cout<<"删除第 2 个元素成功!"<<endl;
LinkPrint(L);
}else {
cout<<"删除第 2 个元素失败!"<<endl;
}
//9. 销毁单链表
LinkDestroy(L);
system("pause");
return 0;
}
更多推荐
已为社区贡献1条内容
所有评论(0)