zzk.213 2022-10-06 22:32 采纳率: 87.8%
浏览 170
已结题

删除重复元素 保留只出现一遍的元素

img


要达成这样的效果 第三个的话总是前两个删不掉

void RD(Node** phead) {
    Node* p = *phead;
    Node* q = p->next;

    while (p != NULL && p->next != NULL)
    {
        if (p->data != p->next->data)//值不相等,p,q一起往后走 
        {
            q = p;
        }
        else//值相等
        {
            while (p->next != NULL && p->data == p->next->data)
            {
                p = p->next;
            }
            q->next = p->next;//将有重复的值的元素都跳过 
        }
        p = p->next;
    }
}

  • 写回答

5条回答 默认 最新

  • 日向晚,声声慢 2022-10-07 13:34
    关注
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct Node
    {
        int data;
        int lenth;
        struct Node* next;
    }Node_t;
    
    //开辟空间+初始化 
    Node_t* AollocNode(int x)
    {
        Node_t* p = (Node_t*)malloc(sizeof(Node_t));
        if (p == NULL)//检测是否开辟成功
        {
            perror("molloc");
        }
        p->data = x;
        p->next = NULL;
        return p;
    }
    
    
    //尾插法创建链表 2
    void TailCreatList(Node_t** pend)
    {
        int i = 0;
        int x = 0;
        int n = 0;
        printf("请输入初始化链表的个数");
        scanf("%d", &n);
        (*pend)->lenth = n;
        for (i = 0; i < n; i++)
        {
            scanf("%d", &x);
            Node_t* p = AollocNode(x);
            (*pend)->next = p;
            *pend = p;
        }
    }
    //打印链表
    void ShowList(Node_t* head)
    {
        Node_t* p = head->next;
        while (p)
        {
            printf("%d->", p->data);
            p = p->next;
        }
        printf("NULL\n");
    }
    void DeReList(Node_t** phead)
    {
        if ((*phead)->next == NULL)//对第一个节点进行判断
        {
            return;
        }
        Node_t* p = (*phead)->next->next;//指向第二个节点
        Node_t* p1 = (*phead)->next;//p的前驱
        Node_t* p2 = (*phead);//p1的前驱
    
        int flag = 1;
        int bedata = 0;//记录重复的数据
        while (p) 
        {
            flag = 1;
            if (p->data == p1->data || bedata == p1->data)
            {
                //用p4释放节点每次释放一个,p1,p指向后面的节点
                Node_t* p4 = p1;
                bedata = p1->data;
                //1 1 1 2
                p1 = p1->next;
                p = p1->next;
                p2->next = p1;
                
    
                free(p4);
    
                flag = 0;
                
            }
            if (flag)
            {
                p = p->next;
                p1 = p1->next;
                p2 = p2->next;
            }
        }
        //判断最后一个节点是否是重复的
        if (p1->data == bedata)
        {
            p2->next = p1->next;
            free(p1);
        }
    
    }
    int main()
    {
    
        Node_t* head = AollocNode(0);
        Node_t* end = head;
        //尾插入创建
        TailCreatList(&end);//第二个图片是这个没有调用
        DeReList(&head);
        ShowList(head);
        free(head);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 赞助了问题酬金15元 10月6日
  • 创建了问题 10月6日

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable