数据结构-链表-删除所有值为x的结点

题目:

将一个链表中元素值为x的结点删除。(链表数据域为整数,初始长为6个元素)
**输入提示信息:"输入数组%d个元素的值。\n"
**输入格式:"%d"
**输出提示:"此链表各个结点的数据域为:"
**输出格式:"%d "
**输入提示信息:"输入要删除的数据x: "
**输入格式:"%d"
**输出提示: "删除后链表各个结点的数据域为:"
**输出格式:"%d "

#include<stdio.h>
#include<stdlib.h>
#define N 6
struct note
{
    int i;
    struct note*next;
};
void freetem(struct note *head)
{
        struct note *pre=head;
        struct note *aft=head;
        while(aft!=NULL)
        {
            pre=aft;
            aft=pre->next;
            free(pre);
        }
}
struct note*  find(struct note*head,int x)
{
    struct note*p=head;
    struct note*pre=head;
    if(head->i==x)
    {
        p=p->next;
        head=p;
        pre->next=NULL;
        free(pre);

        return head;
    }

    while(p!=NULL&&p->next!=NULL)
    {
        pre=p;
        p=p->next;
        if(p->i==x)
        {
            pre->next=p->next;
            p->next=NULL;
            free(p);
            p=pre;
        }
    }

    return head;
}
main()
{
    int num[N],i=0;
    struct note*head=NULL;
    head=(struct note*)malloc(sizeof(struct note));
    if(head==NULL)
    {
        printf("error");
        exit(0);
    }
    printf("输入数组%d个元素的值。\n",N);
    scanf("%d",&num[i]);
    head->i=num[i];
    struct note*p=head;
    for(i=1;i<N;i++)
    {
        scanf("%d",&num[i]);
        struct note *pst=(struct note*)malloc(sizeof(struct note));
        if(head==NULL)
        {
            printf("error");
            exit(0);
        }
        pst->i=num[i];
        p->next=pst;
        pst->next=NULL;
        p=pst;
    }
    printf("此链表各个结点的数据域为:\n");
    p=head;
    while(p!=NULL)
    {
        printf("%d ",p->i);
        p=p->next;
    }
     printf("输入要删除的数据x: ");
     int x;
     scanf("%d",&x);
     struct note*newhead=find(head,x);
     printf("删除后链表各个结点的数据域为:");
     p =newhead;
     while(p!=NULL)
    {
        printf("%d ",p->i);
        p=p->next;
    }
    freetem(head);
}
 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以遍历整个链表,找到值为x的结点,然后将其删除。具体实现可以使用双指针,一个指向当前结点,一个指向前一个结点,当找到值为x的结点时,将前一个结点的next指向当前结点的next,即可删除结点。如果要删除所有值为x的结点,可以在遍历时使用循环,直到链表不存在值为x的结点为止。 ### 回答2: 链表是一种数据结构,它由一系列结点组成,每个结点包含一个数据元素和指向下一个结点的指针。对于将一个链表元素值为x的结点删除的问题,我们需要运用链表的基本操作——遍历链表并对需要删除结点进行处理。 首先,我们要对链表进行遍历,找到元素值为x的结点。由于数据域为整数,我们可以逐一比较每个结点的数据是否等于x。当找到指向元素值为x的结点的指针时,我们需要进行删除操作。删除操作需要修改指针的指向,所以我们需要记录该结点的前一结点的指针。 在进行删除操作前,我们需要特别考虑一些情况: 1. 要删除结点是头结点。此时我们需要特判,将头结点的指针修改为下一个结点。 2. 要删除结点是尾结点。此时我们需要特判,将尾结点的前一结点指针的下一个节点指针设置为NULL。 删除操作完成后,我们需要及时释放该结点的内存空间,避免内存泄漏。 代码如下: ``` struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* deleteNode(ListNode* head, int x) { ListNode* curr = head, * prev = NULL; while (curr != NULL && curr->val != x) { prev = curr; curr = curr->next; } if (curr == NULL) { return head; } if (prev == NULL) { head = curr->next; } else { prev->next = curr->next; } delete curr; return head; } ``` 以上代码实现了将一个链表元素值为x的结点删除的操作。 ### 回答3: 要删除一个链表元素值为x的结点,需要先找到这个结点。遍历整个链表,将每个结点的数据域和x进行比较,如果相等,则找到了要删除结点。为了方便删除操作,我们需要记录两个指针,一个指向当前结点,另一个指向当前结点的前一个结点。 具体的: 1. 初始化两个指针p和pre,将它们的初始值都指向链表的头节点,pre指向NULL。 2. 遍历整个链表,在每个结点上执行以下操作: (1)如果当前结点的数据域等于x,那么这个结点就是要删除结点删除它,具体如下: (a) 将前一个结点的next指针指向当前结点的next指针,即pre->next = p-> next; (b) 释放当前结点的内存空间,即free(p)。 (2)如果当前结点的数据域不等于x,那么继续向后遍历,将当前结点赋值给p,将前一个结点赋值给pre。 3. 遍历完整个链表后,将链表的头节点指向链表的第二个结点。如果链表的头结点数据域等于x,那么删除结点,直接将链表的头节点指向链表的第二个结点即可。 4. 最后释放头节点的内存空间,返回操作完成。 对于空链表链表没有值为x的结点的情况,直接返回即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值