码迷,mamicode.com
首页 > 其他好文 > 详细

单向链表的实现

时间:2021-06-30 17:33:30      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:位置   查找   end   扫描   out   定义   des   编译环境   失败   

链表核心要素:每个节点由数据域和指针域组成,指针域指向下一个节点的内存地址。

代码实现

  定义结构体

 

typedef struct Linknode
{
	int data;//节点的数据域
	Linknode* next;//节点的指针域

}_Linknode,Linklist;//数据域,指针域

 

  初始化一个空链表

bool InitList(Linklist* &list)
{
list = new _Linknode;

if (!list) return false;

list->next = NULL;
return true;
}

  

  前插法

bool Listinsert_front(Linklist* &list, _Linknode* node)
{
if (!list || !node) return false;

node->next = list->next;
list->next = node;

return true;
}

  

  尾插法

bool Listinsert_back(Linklist* &list, _Linknode* node)
{
_Linknode* last = NULL;
if (!list || !node) return false;

last = list;

while (last->next)last = last->next;

node->next = NULL;
last->next = node;

return true;
}

  

  指定位置插入

bool LinkInsert(Linklist* & list, int i, int& e)
{
if (!list) return false;

int j = 0;
Linklist* p, * s;

p = list;

while (p && j < i - 1)//查找位置为i-1的节点,p指向该节点
{
p = p->next;//每循环一次p向后进一步,指向下一个节点
j++;
}

if (!p || j > i - 1) return false;

s = new _Linknode;//生成新的节点
s->data = e; 
s->next = p->next;
p->next = s;

return true;
}

  

  元素获取

bool Link_GetElem(Linklist*& list, int i, int& data)
{
int index;
Linklist* p;

if (!list || !list->next) return false;

p = list->next;
index = 1;

while (p && index < i)//顺链表向后扫描,直到p指向第i个元素或p为空
{
p = p->next;
index++;
}

if (!p || index > i) return false;

data = p->data;

return true;
}

  

  查找元素按值查找

bool Lonk_FindElim(Linklist*& list, int data)
{
int index;
Linklist* p;
p = list->next;
index = 1;

if (!list || !list->next) return false;

while (p && p->data != data)
{
p = p->next;
index++;
}
cout << index << endl;

if (!p)
{
index = 0;
return false;
}

return true;
}

  

  单链表的遍历

void Linkprint(Linklist* list)
{
_Linknode* p = NULL;
if (!list)
{
cout << "链表为空。" << endl;
return;
}

p = list->next;

while (p)
{
cout << p->data << "\t";
p = p->next;
}
cout << endl;
}

  

  删除元素

bool LinkDelete(Linklist*& list, int i)
{
Linklist* p, * q;
int index = 0;
p = list;

while ((p->next) && (index < i - 1))//查找第 i-1 个结点,p 指向该结点
{
p = p->next;
index++;
}

if (!p->next || (index > i - 1))//当 i>n 或 i<1 时,删除位置不合理
{
return false;
}

q = p->next;
p->next = q->next;
delete q;

return true;
}

  

  销毁单链表

void LinkDestory(Linklist*& list)
{
//定义临时节点p指向头节点
Linklist* p = list;
cout << "销毁链表!" << endl;

while (p)
{
list = list->next;//list 指向下一个节点
delete p;
p = list;//p 移向下一个节点
}

  return;
}

  

  main函数

 

int main(void)
{
Linklist* list = NULL;
_Linknode* s = NULL;
//初始化一个空链表
InitList(list);
//前插法插入数据
int n;
cout << "前插法创建单链表" << endl;
std::cout << "请输入元素个数 n:";
cin >> n;
cout << "\n 请依次输入 n 个元素:" << endl;

 

//头插法
for (int i = 0; i < n; i++)
{
s = new _Linknode;
cout << "头部第" << i << "个:";
cin >> s->data;
Lestinsert_front(list, s);
}
Linkprint(list);

 

//尾插法
std::cout << "请输入元素个数 n:";
cin >> n;
for (int i = 0; i < n; i++)
{
s = new _Linknode;
cout << "尾部第" << i << "个:";
cin >> s->data;
Listinsert_back(list, s);
}
Linkprint(list);

 

//指定位置插入
for (int i = 0; i < 3; i++)
{
cout << "插入地址:";
cin >> n;
int data = 0;
cout << "参数:";
cin >> data;
LinkInsert(list, n, data);
Linkprint(list);
}

 

int element;
//获取第二个节点的值
if (Link_GetElem(list, 2, element))
{
cout << "获取成功!" << element << endl;
}
else
{
cout << "获取失败!" << endl;
}
//查找值为2的节点
if (Lonk_FindElim(list, 2))
{
cout << "查找成功" << endl;
}
else
{
cout << "查找失败" << endl;
}
cout << "删除之后" << endl;
LinkDelete(list, 2);//删除
Linkprint(list);//遍历
LinkDestory(list);//销毁
Linkprint(list);//遍历
return 0;
}

 

  

 

编译环境:visual studio 2019

注:如有错误请与我联系,万分感谢!!!

 

单向链表的实现

标签:位置   查找   end   扫描   out   定义   des   编译环境   失败   

原文地址:https://www.cnblogs.com/WU20/p/14950083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!