当前位置: 首页 > 知识库问答 >
问题:

c - C语言的链表该如何删除尾节点呢?

熊哲圣
2023-05-22
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
typedef struct Node {
    int val;
    struct Node* next;
}Node, * ListNode;
ListNode LinkListInit();
bool createTail(ListNode L);
void printLinkList(ListNode L);
int getLen(ListNode L);
ListNode LinkListInit() {
    Node* L;
    L = (Node*)malloc(sizeof(Node));   //申请结点空间 
    if (L == NULL) { //判断是否有足够的内存空间 
        printf("申请内存空间失败\n");
    }
    L->next = NULL;//将next设置为NULL,初始长度为0的单链表 
    return L;
}
//输入一个链表的值
bool createTail(ListNode L) {
    int x;
    Node* s, * r = L;
    printf("输入一个链表的值:\n");
    scanf("%d", &x);
    while (x != 9999) {
        s = (Node*)malloc(sizeof(Node));
        s->val = x;
        r->next = s;
        r = s;
        scanf("%d", &x);
    }
    r->next = NULL;
    return true;
}

//链表长度
int getLen(ListNode L) {
    int len = 0;
    ListNode R;
    if (L->next == NULL)//头指针为空,则链表不包含元素,返回0
        return 0;
    else {
        R = L->next;
        while (R != NULL) {
            R = R->next;
            len++;
        }
    }
    return len;
}


//按值查找结点值
int GetSize(ListNode L, int num) {
    Node* p = L;
    int j = 0;
    while (p != NULL && p->val != num) {
        p = p->next;
        j++;
    }
    return j;
}

//按序号查找结点值
Node* GetElem(ListNode L, int i) {
    int j = 1, temp;
    Node* p = L->next;
    if (i == 0)
        return L;//若i = 0,则返回头结点
    if (i < 1) {
        return NULL;//若i无效,则返回NULL
    }
    while (p && j < i) {//查找到第i个结点
        p = p->next;
        j++;
    }
    return p;
}

//移除链表元素
ListNode removeElements(ListNode L, int val) {
    ListNode p = NULL, q;
    p = L;
    if (p == NULL) {
        return NULL;
    }
    while (p) {
        if (p->val == val && p->next != NULL) {
            q = p->next;
            p->val = p->next->val;
            p->next = q->next;
            free(q);
        }
        else if (p->val == val && p->next == NULL) {
            q = p->next;
            p = q;
            free(p);
            //p->next = NULL;
        }
        else {
            p = p->next;
        }
    }
    return L;
}

//输出链表
void printLinkList(ListNode L)
{
    ListNode p;
    p = L->next;
    if ( p== NULL) {
        printf("null");
    }
    while (p)
    {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}


int main(void) {
    ListNode L1, L2,R,L;
    int x;
    L1 = LinkListInit();
    L2 = LinkListInit();
    L = LinkListInit();
    R = LinkListInit();
    createTail(L1);
    printf("请输入要删除的数字:\n");
    scanf("%d", &x);
    R = removeElements(L1, x);
    printLinkList(R);
    return 0;
}

这是我的代码,在删除的时候总是删不掉尾节点,该如何处理呢?
image.png

共有1个答案

酆奇文
2023-05-22
ListNode removeElements(ListNode L, int val) {
    ListNode p = L, prev = NULL;
    while (p != NULL) {
        if (p->val == val) {
            if (p->next != NULL) {
                ListNode q = p->next;
                p->val = p->next->val;
                p->next = q->next;
                free(q);
            } else if (prev != NULL) {
                prev->next = NULL;
                free(p);
                p = NULL;
            }
        }
        prev = p;
        if (p != NULL) {
            p = p->next;
        }
    }
    return L;
}
 类似资料:
  • 这是我的remove函数,用于删除具有元素的节点。我得到了一个seg错误,我很确定这是因为temp->prev是前面的哨兵,所以从技术上来说,它不在双链表中。如果这是正确的,我实际上如何防止这种情况?如有任何帮助,不胜感激。 编辑:刚刚更新了代码,但仍然出现了Seg错误

  • 本文向大家介绍C++删除链表中间节点的方法,包括了C++删除链表中间节点的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++删除链表中间节点的方法。分享给大家供大家参考,具体如下: 题目: 给定链表头结点head,实现删除链表的中间节点函数。 解题思路及代码: 快慢指针,快指针走两步,慢指针一步。 当快指针走到终点时,慢指针正好是链表中间节点,删除此节点即可。 链表结构定义: 算法

  • 双链表节点是在main函数中创建的。Ender和header已定义。在删除节点函数处中断-ender为空。 释放最后一个和第一个输入的内存的最佳方法是什么,即:删除:233,A和888,F?

  • 我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)

  • 我正在为二元搜索树组装函数,结果遇到了麻烦。我正在研究当需要从树中删除包含指定值的节点时可能遇到的每种情况。如果节点没有左右子节点,我不确定如何处理释放节点。函数必须返回节点。我是否备份、检查每个左、右子级,并在子级中删除该值?但是如果该值在根中,我是否会遇到类似的问题,即如何删除它?作为解释,程序使用一个void指针,然后在一个单独的函数compare()中强制转换类型val,该函数计算两个值并

  • 本文向大家介绍c语言单链表尾添加的深入讲解,包括了c语言单链表尾添加的深入讲解的使用技巧和注意事项,需要的朋友参考一下 前言 犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺。由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正。制作不易,不喜勿喷,谢谢!!! 在正文开始之前,我先对数组和链表进行简单的对比分析。