数据结构之简单链表C++实现

都是简单的链表实现,就不写过多的注释了,挑一些重要的写。

视频讲解: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++执行,希望大家能帮忙指出错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值