无头节点单链表基本操作(头插、尾插、删除)————附完整代码

0 背景

一般使用单链表多使用带头节点的单链表,好处是:

  • 1 对表首操作和在表的其他位置的操作一致,无需特殊处理;
  • 2 判链表是否为空时,头指针都是指向头节点的非空指针,空表和非空表的处理也得到统一。【如果不带头节点时,空链表的头指针为NULL】

1 创建链表操作

存储结构定义:

typedef struct LNode{
    int data;//数据
    struct LNode* next;//指针域
}LNode;

1.1 头插法

//头插法
LNode* List_Head(LNode* &L, int x){
    LNode* s;
    s = (LNode*) malloc(sizeof(LNode));
    s->data = x;
    s->next = L;
    L = s;//把新节点的地址赋给头指针
    return s;
}
//创建头指针
    LNode* L = (LNode*)malloc(sizeof(LNode));
    /*
     * 头插法
     */
     //第一个数据赋值
    L->data = 2;
    L->next = NULL;
    //

1.2 尾插法

//尾插法
LNode* List_Tail(LNode* &r, int x){
    LNode *s;
    s = (LNode*)malloc(sizeof(LNode));
    s->data = x;
    r->next = s;
    r = s;
    r->next = NULL;
    return r;
}
    //创建头指针
    LNode* L = (LNode*)malloc(sizeof(LNode));
     /*
     * 尾插法
     */
    //第一个数据赋值
    L->data = 2;
    L->next = NULL;
    LNode* r = L;//表尾指针
    

2 删除元素

//删除值为x的节点,L为头指针
void List_Erase(LNode* &L, int x){
    LNode* p;
    if(L == NULL) return;
    if(L->data == x){
        p = L;
        L = L->next;
        /*
        使原本指向当前结点的指针指向下一个结点【等价于L->next = L->next->next】,
        因此下面的语言不会断链
        */
        free(p);
        List_Erase(L, x);
    }else{
        List_Erase(L->next, x);
    }
}

3 完整示例

#include <cstdio>
#include <cstdlib>

typedef struct LNode{
    int data;//数据
    struct LNode* next;//指针域
}LNode;
//尾插法
LNode* List_Tail(LNode* &r, int x){
    LNode *s;
    s = (LNode*)malloc(sizeof(LNode));
    s->data = x;
    r->next = s;
    r = s;
    r->next = NULL;
    return r;
}
//头插法
LNode* List_Head(LNode* &L, int x){
    LNode* s;
    s = (LNode*) malloc(sizeof(LNode));
    s->data = x;
    s->next = L;
    L = s;
    return s;
}
//删除值为x的节点
void List_Erase(LNode* &L, int x){
    LNode* p;
    if(L == NULL) return;
    if(L->data == x){
        p = L;
        L = L->next;
        free(p);
        List_Erase(L, x);
    }else{
        List_Erase(L->next, x);
    }
}

int main(){
    //创建头指针
    LNode* L = (LNode*)malloc(sizeof(LNode));
    /*
     * 头插法
     */
    L->data = 2;
    L->next = NULL;
    List_Head(L, 5);
    List_Head(L, 2);
    List_Head(L, 4);
    List_Head(L, 3);
    List_Head(L, 2);
    List_Head(L, 1);
    List_Head(L, 2);
    /*
     * 尾插法
     */
//    L->data = 2;
//    L->next = NULL;
//    LNode* r = L;//表尾指针
//    List_Tail(r, 1);
//    List_Tail(r, 2);
//    List_Tail(r, 3);
//    List_Tail(r, 4);
//    List_Tail(r, 2);
//    List_Tail(r, 5);
//    List_Tail(r, 2);
    //判空链表
  //  L->data = 2;
    //L->next = NULL;

    /*
     * 删除元素值为2
     */
    List_Erase(L, 2);
    /*
     * 打印链表
     */
    while(L != NULL){
        printf("%d ", L->data);
        L = L->next;
    }

    return 0;
}

结果:
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页