• 王道数据结构 (4) 单链表 删除节点


     p->next = q->next;

     p-next  原来是 q  现在变成 q->next  

    这个就是将 *q 从链中断开 

    代码:

    /*单链表(含头结点)*/
    #include<stdio.h>
    #include<stdlib.h>
     
    
    typedef int ElemType;
     
    typedef struct LNode{
        ElemType data;  //数据域
        struct LNode *next;  // 指针域
    }LNode,*LinkList;
     
    LinkList CreateList1(ElemType a[], int n);  //头插法建立单链表
    LinkList CreateList2(ElemType a[], int n); //尾插法创建单链表
    void OutputList(LinkList L); //输出单链表全部元素
    int Length(LinkList L); //获取单链表长度(不含头结点)
    int InsertLNode(LinkList L, int i, ElemType e); //在第i个位置插入结点,即在第i-1个结点之后插入新结点
    int DeleteNode(LinkList L, int i, ElemType *e);  //删除第i个结点,并用e返回其值
     
     
    void main(){
        LinkList L = NULL;
        ElemType a[] = { 1, 2, 3, 4, 5 };
        ElemType e;
        L = CreateList2(a, 5);
        OutputList(L);
        InsertLNode(L, 6, 6);
        OutputList(L);
        DeleteNode(L, 1, &e);
        printf("%d
    ", e);
        OutputList(L);
     
    }
     
    LinkList CreateList1(ElemType a[], int n){   //头插法建立单链表
        int i;
        LinkList L = NULL, s = NULL;
        L = (LNode*)malloc(sizeof(LNode));
        L->next = NULL;
     
        for (i = 0; i < n; i++){
            s = (LNode*)malloc(sizeof(LNode));
            s->data = a[i];
            s->next = L->next;
            L->next = s;
        }
        return L;
    }
     
    LinkList CreateList2(ElemType a[], int n){   //尾插法创建单链表
        int i;
        LinkList L = NULL, s = NULL, r = NULL;
        L = (LNode*)malloc(sizeof(LNode));
        L->next = NULL;
        r = L;
        for (i = 0; i < n; i++){
            s = (LNode*)malloc(sizeof(LNode));
            s->data = a[i];
            s->next = NULL;
            r->next = s;
            r = s;  //r指向新的表尾结点
        }
        r->next = NULL;
        return L;
    }
    // 输出所有链表的思路:
    // 1.让头节点的next 指向下一个节点 
    // 2. 做一个循环 当超出时打断循环 循环内的时候 p 指向下一个 p 是 现在的节点 p=p-> next 节点会向下一个移动
    void OutputList(LinkList L){  //输出单链表全部元素
        LinkList p = L->next;
        while (p){
            printf("%d  ", p->data);
            p = p->next;
        }
        printf("
    ");
    }
     
    int Length(LinkList L){  //获取单链表长度(不含头结点)
        LinkList p = L->next;
        int len = 0;
        while (p){
            len++;
            p = p->next;
        }
        return len;
    }
     
    int InsertLNode(LinkList L, int i, ElemType e){ //在第i个位置插入结点,即在第i-1个结点之后插入新结点
        if (i<1 || i>Length(L) + 1){
            printf("插入位置错误!
    ");
            return -1;
        }
        LinkList p = L;  //p始终指向第i-1个结点
        LinkList s = NULL;
        while (--i){
            p = p->next;
        }
        s = (LNode*)malloc(sizeof(LNode));
        s->data = e;
        s->next = p->next;
        p->next = s;
     
        return 1;
    }
     
    int DeleteNode(LinkList L, int i, ElemType *e) { //删除第i个结点,并用e返回其值
        if (i<1 || i>Length(L)){
            printf("删除位置错误!
    ");
            return -1;
        }
        LinkList p = L; //p指向待删除结点的前驱结点
        LinkList q; //q指向待删除结点
        while (--i){
            p = p->next;
        }
        q = p->next;
        p->next = q->next;
        *e = q->data;
        free(q);
        return 1;
    }
    越努力越幸运
  • 相关阅读:
    【模板】扩展中国剩余定理(EXCRT)
    战略游戏(树形DP)
    二叉苹果树(树形DP)
    货车运输(最大生成树,LCA)
    [CQOI2016]密钥破解
    Pollard-Rho算法andMiller_Rabin算法
    [TJOI2009]猜数字(中国剩余定理)
    中国剩余定理(学习笔记)
    线段树 Segment Tree
    辗转相除法
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13361859.html
Copyright © 2020-2023  润新知