学习创建单链表时,网上教程感觉大多没有释放内存,我认为这是一个bug,以下是根据自己的想法写的链表创建以及添加删除结点。
//第一章节主要了解了顺序存储结构
//所谓的顺序存储结构存储数据的内存空间是连续的,由于是连续的存储空间
//所以在存储和读取比较方便,时间复杂度是o(1),但是在添加和删除元素会比较
//麻烦,以添加为例,如果恰好添加的元素在最后一位,那么其他元素则不需要移动
//如果添加的元素在第一位,那么则需要移动n-1次。所以对于顺序存储结构来说,
//增加和删除元素时间复杂度是o(n)。顺序存储结构的优缺点为存储和读取速度较快,的那hi
//对数据进行增删改查时速度比较慢,可以不用随着元素之间的逻辑变化增加存储空间
//但是不知道提前预留多大的内存空间。
//链表 每个元素不但包含数据域,还包含了指针域,指针域指向下一个节点的的地址,除了头节点和
//尾节点以外,每一个节点都有一个前驱结点和一个后继结点。
//单链表 循环链表,双向链表 以及静态链表 下面要做的就是对链表进行增删改查。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct list
{
int data;
list * next;
};
//输出元素
void printlist(list* node)
{
list *p = node;
while (p != NULL)
{
cout << "这个值是" << p->data << endl;
p = p->next;
}
}
//插入元素 在第n个位置插入
//head为原链表的头结点头指针
//data为插入的数据
void insert(int n,list* head,list *data) {
list* temp = head;
list* pre = nullptr;
if (n ==1)
{
cout << "插入头节点" << endl;
data->next = temp->next;
temp->next = data;
return;
}
for (int i = 1; i <= n; i++)
{
//判断是否越界
if (temp == nullptr)
{
cout << "insert position is overbundary" << endl;
return;
}
else
{ //记录前一个结点
pre = temp;
temp = temp->next;
}
}
if (temp == nullptr && pre != nullptr)
{
cout << "插入的位置是最后一个位置" << endl;
pre->next = data;
}
else
{
//第一种方式
//pre->next = data;
//data->next = temp;
//也可以只用pre就可以
data->next = pre->next;
pre->next = data;
}
};
//删除节点数据
void deleteNode(int n,list *head)
{
list* node = head;
if (n == 1)
{
printf("删除第一个结点\n");
node->next = node->next->next;
return;
}
for (int i = 1; i <n; i++)
{
if (node == nullptr)
{
printf("delete is overbundary");
return;
}
node = node->next;
}
if (node->next->next == nullptr)
{
node->next = nullptr;
return;
}
else
node->next = node->next->next;
}
int main()
{
//创建一个单向链表
//首先使得两个指针指向第一个元素,指向第一个元素后头指针不变
//后续指针继续增加
//头结点
list* head = new list;
head->data = 0;
head->next = nullptr;
//临时结点做标记用
list* temp = head;
for (int i = 1; i <= 3; i++)
{
list *node=new list;
list* test = new list;
node->data = i;
node->next = nullptr;
test->data = node->data;
test->next = node->next;
temp->next =test;
temp = temp->next;
delete node;
delete test;
}
printf("原来的值\n");
printlist(head);
printf("插入头结点之后\n");
list* data = new list;
data->data = 100;
data->next = nullptr;
insert(2, head, data);
printlist(head);
delete data;
printf("删除结点之后\n");
deleteNode(2, head);
printlist(head);
return 0;
}