都是简单的链表实现,就不写过多的注释了,挑一些重要的写。
视频讲解:https://www.bilibili.com/video/av50941381/
由于头结点是不可以用于存储业务数据的,我的风格是喜欢不浪费而将链表长度存进去,这就给每一步的增删结点都多一条语句,大家可以酌情删减。h->data表示链表的长度,这样获取链表长度就是一个常数级操作了。经常用到h->data的所以每个函数我都不改变指向链表的头指针,需要遍历的话就以l=h,用l遍历。
需要注意的写法是:free()函数前后的代码。
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int Element;
typedef struct Lnode{
Element data;
Lnode* next;
}LNode;
typedef Lnode * LinkNode;
bool createLinkList(LinkNode& h){
if(h==NULL){
h=(LinkNode)malloc(sizeof(Lnode));
if(h==NULL){
cout<<"error";
return false;
}
}
h->data=0;
h->next=NULL;
return true;
}
bool deleteLinkList(LinkNode& h){
LinkNode l=h->next;
while(l){
h->next=l->next;
h->data--;
free(l);
l=h->next;
}
cout<<"--清空操作--"<<endl;
return true;
}
void printLinkList(LinkNode l){
cout<<"长度为"<<l->data<<" ";
l=l->next;
while(l){
cout<<"结点:"<<l->data<<" ";
l=l->next;
}
cout<<endl;
}
bool insertNode(LinkNode& h,Element e){
LinkNode l=(LinkNode)malloc(sizeof(Lnode));
if(l==NULL){
return false;
}
l->data=e;
l->next=h->next; //对于刚申请的空间,先用自己的next指向其他结点
h->next=l; //然后头结点的next指向自己
h->data++;
return true;
}
int findNodeIndexByElement(LinkNode h,Element e,int z=0){ //跳过z个查找
LinkNode l=h->next;
int i=1;
while(l){
if(l->data==e) {
if(z==0) return i; //查找到值的时候,z为0的时候返回,不为0时跳过,等待下一次查找。
z--;
}
l=l->next;
i++;
}
return -1;
}
bool deleteNode(LinkNode& h,Element &e){
LinkNode l=h->next;
h->next=l->next;
e=l->data;
free(l);
h->data--;
}
int main(){
Lnode * head=NULL;
createLinkList(head);
insertNode(head,2);
insertNode(head,4);
insertNode(head,3);
insertNode(head,2);
insertNode(head,1);
printLinkList(head);
cout<<"测试查找:"<<findNodeIndexByElement(head,2)<<endl;
cout<<"测试查找:"<<findNodeIndexByElement(head,2,1)<<endl;
cout<<"测试查找:"<<findNodeIndexByElement(head,2,2)<<endl;
Element a[2];
deleteNode(head,a[0]);
deleteNode(head,a[1]);
cout<<"删除了:"<<a[0]<<"、"<<a[1]<<endl;
printLinkList(head);
deleteLinkList(head);
printLinkList(head);
}
直接复制到c++执行,希望大家能帮忙指出错误