链表的几个基本操作代码只要弄懂指针、链表的数据结构就不难实现,代码如下,不懂得话可以留言询问,有错误的话请指正
运行环境 vs2019
#include<iostream>
using namespace std;
//定义表结点的数据结构:数据+指针
struct ListNode
{
int value;
ListNode* next;
};
void creatList(ListNode * linkList,int n)
{
//链表动态增加元素
//定义创建新的元素的辅助指针 *p
ListNode* p = linkList;
for (int i = 0; i < n; i++)
{
//动态创建新的链表节点并初始化
ListNode* newNode = new ListNode; //开辟了链表的存储空间 不能用delete释放
newNode->value = i;
newNode->next = NULL;
//辅助指针把新创建的节点接到链表的结尾
p->next = newNode;
//辅助指针后移指向最新的节点
p = newNode;
//delete newNode; 这里不能释放newNode,因为此时 p = newNode ,是链表的最后一个节点
}
//linkList = linkList->next; //执行这个语句就把头指针指向第一个元素
}
void outputList(ListNode* linkList)
{
if (linkList == NULL|| linkList->next == NULL)
{
cout << endl << "链表为空"<<endl;
return;
}
else
{
cout << "链表的元素:";
ListNode* p = linkList;
while (p->next != NULL)
{
p = p->next;
cout << p->value << " ";
}
cout << endl;
}
}
int lengthOfList(ListNode* linkList)
{
if (linkList == NULL || linkList->next == NULL)
{
return 0;
}
else
{
ListNode* p = linkList;
if (p != NULL) //如果没有判断p是否赋值成功vs2019会警告越界
{
int count = 0;
while (p->next != NULL)
{
p = p->next;
count++;
}
return count;
}
}
}
int getValue(ListNode* linkList, int index)
{
//判断是否越界
if (index <= lengthOfList(linkList))
{
ListNode* p = linkList;
for (int i = 0; i < index; i++)
{
p = p->next;
}
return p->value;
}
}
void insert(ListNode* linkList, int site, int e)
{
//判断是否越界
if (site <= lengthOfList(linkList))
{
ListNode* p = linkList;
for (int i = 0; i < site; i++)
{
p = p->next;
}
ListNode* pTemp = new ListNode;
pTemp->value = e;
pTemp->next = p->next;
p->next = pTemp;
cout << "插入元素成功"<<endl;
}
}
void deleteE(ListNode* linkList, int site)
{
if (site <= lengthOfList(linkList))
{
ListNode* p = linkList;
for (int i = 0; i < site; i++)
{
p = p->next;
}
ListNode* pTemp = new ListNode;
pTemp = p->next;
p->next = pTemp->next;
delete pTemp;
cout << "删除元素成功" << endl;
}
}
void deleteList(ListNode* linkList)
{
ListNode* p = linkList->next; //定义p为首节点
while (p != NULL)
{
ListNode* pTemp=p;
p = p->next;
delete pTemp;
}
linkList->next = NULL;
cout << endl << "删除链表成功" << endl;
}
int main()
{
//创建头指针
ListNode* list = new ListNode;
//头指针初始化
list->next = NULL;
int n;
cout << "输入链表长度:";
cin >> n;
// 创建链表
creatList(list, n);
//输出链表的所有元素
outputList(list);
//获取链表的长度:
int len = lengthOfList(list);
cout << "链表的长度:" << len << endl;
//获取指定节点的值
cout << endl << "输入要获取链表的第几个元素:";
int index;
cin >> index;
int E = getValue(list, index);
cout<<"第"<<index<<"个元素的值为:" << E<<endl;
//在指定位置插入元素:
cout << endl << "输入插入链表元素的位置:";
int site;
cin >> site;
cout << endl << "输入插入链表的元素:";
int e;
cin >> e;
insert(list, site, e);
outputList(list);
//在指定位置删除元素:
cout << endl << "输入插入要删除的链表元素的位置:";
cin >> site;
deleteE(list, site);
outputList(list);
//清空链表
cout << "是否清除链表的所有节点? 输入1或0:";
int ifDelete;
cin >> ifDelete;
while (ifDelete != 0 && ifDelete != 1)
{
cout << endl << "输入错误,请重新输入:" << endl;
cin >> ifDelete;
}
if (ifDelete == 0)
{
cout << endl << "结束" << endl;
}
else
{
deleteList(list);
outputList(list);
}
//别忘了delete
delete list;
return 0;
}