简单的实现单项链表
链表是一种非常重要的数据结构,记得刚学习的时候,简直是一头雾水,现在回过头来练练手,看看自己有没有啥长进。
直接上代码:
#include <iostream>
#include <vector>
using namespace std;
typedef struct Node {
int num_;
struct Node *next;
}Node;
//通过模板的使用,可以避免numList数组退化成指针
template<typename T>
void makeList(Node *head,T& numList){
// cout<< sizeof(numList) / sizeof(*numList)<<endl;
head->num_ = 0;
head->next = nullptr;
// p表示当前指向的节点,s表示下一个节点
Node *p, *s;
p = head;
for(auto &num : numList){
s = (Node*)malloc(sizeof(Node));
s->num_ = num;
s->next = nullptr;
p->next = s;
p = s;
}
}
void print_(Node *head){
Node *p;
p = head->next;
while (p != nullptr){
// 打印节点的num_和节点的存储地址
cout<<p->num_<<" "<<p<<" ";
p = p->next;
}
cout<<endl;
}
void delete_(Node *head, int index){
// index > 0
Node *p;
p = head;
int count = 0;
// 找到被删除节点的前一个节点
while(count != index - 1){
p = p->next;
count++;
}
// 节点删除需要充分考虑到内存的处理,下面仅仅简单的处理,并不合适
Node *s;
s = (Node*)malloc(sizeof(Node));
s->next = p->next->next;
delete p->next;
p->next = s->next;
free(s);
}
void add_(Node *head, int index, int addNumber){
// index > 0
Node *p;
p = head;
int count = 0;
while(count != index - 1){
p = p->next;
count++;
}
Node *s;
s = (Node*)malloc(sizeof(Node));
s->num_ = addNumber;
s->next = p->next;
p->next = s;
}
int main() {
Node *head;
int a[] = {1,2,3,4,5,6,7,8,9};
// cout<< sizeof(a)/ sizeof(*a)<<endl;
head=(Node*)malloc(sizeof(Node));
makeList(head,a);
print_(head);
delete_(head, 2);
print_(head);
add_(head, 2, 2);
print_(head);
return 0;
}
运行结果:
上面的代码是自己一点一点敲出来的,比起以前还得看书才能敲出来,现在算是有点进步了,虽然只是简单的单向也没有涉及到链表的合并、排序等问题,但是这些足以让我有不小收获。温故而知新的感觉,还不赖!当然啦,还是有很多不足的。
简单的说一下上面代码的几个不足:
- 写代码的时候,尤其是写函数的时候,第一步应该是检查参数,对于不合理的参数要给出对应的处理方式,显然我只是写了index > 0的注释,糊弄了一下
- 处理的内容比较简单,没有啥高端大气上档次的东西。
- 内存处理不严谨,要说上面两个问题还可以修正一下,但是这个问题我是真的头皮发麻,敲这几行的同时自己也算是拣尽脑汁的去探索delete malloc free等的奥秘,虽有收获,但始终做不到完善,听到网上许多大佬讲内存泄漏这样的高级BUG,我默默的留下了无能的眼泪。。。。