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

#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.7k
1 个回答
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;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏