春风吹又生.c 2023-10-07 19:16 采纳率: 54.8%
浏览 4
已结题

为什么输出没反应,也没报错

设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。
提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;
指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。


#include<stdio.h>

#define ERROR 0;
#define OK 1
typedef  int ElemType; //  定义表元素的类型  

typedef struct LNode 
{  //线性表的单链表存储
    ElemType data;
    struct LNode* prior;
    struct LNode* next;

}LNode, * LinkList;

LinkList CreateList(int n) //返回值类型是指向该结点的指针
{
    LNode * p, * q, * head;   //定义三个结点型指针
    int i;
    head = (LinkList)malloc(sizeof(LNode));      
    head->next = NULL;
    p = head;
    for (i = 0; i < n; i++)
    {
        q = (LinkList)malloc(sizeof(LNode));
        printf("input data %i:", i + 1);
        scanf_s("%d", &(q->data));            //输入元素值
        

        q->next = NULL;                    //结点指针域置空
        p->next = q;                       //新结点连在表末尾
        q->prior = p;
        p = q;                       //让p指针每次都指向尾结点
    }
    return head;
}

//输出带头结点单链表的所有元素
void PrintList(LinkList L) 
{      
    LNode* p;
    p = L->next;         //p指向单链表的第1个元素
    while (p != NULL)
    {
        printf("%5d", p->data);
        p = p->next;
    }
}


//删除相同的元素
void delete(LinkList L)
{
    LNode* p, * q;
    p = L->next;//p指向首元结点(第一个元素)
    q = p->next;
    while(p!=NULL)
    {
        while (q != NULL)
        {

            if (q->data == p->data)
            {

                q->next->prior = q->prior;
                q->prior->next = q->next;
                free(q);
            }
            q = q->next;
        }

        p = p->next;
    }


}


int main()
{
    int n;

    printf("请输入链表总元素个数:");
    scanf_s("%d",&n);

    LinkList L=NULL;
    L=CreateList(n);

    PrintList(L);

    delete(L);



}

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-07 21:03
    关注

    引自强大而免费的微信小程序:皆我百晓生。


    你的代码中有一个问题:
    在删除相同元素的操作中,你没有将指针q重置为p的下一个结点,导致每次循环q都会指向上一轮循环中删除的结点的下一个结点,而不是p的下一个结点。
    要修复这个问题,只需要在删除结点后将q指向p的下一个结点即可。

    修改后的代码如下:

    void delete(LinkList L)
    {
        LNode* p, * q;
        p = L->next; // p指向首元结点(第一个元素)
        while (p != NULL)
        {
            q = p->next;
            while (q != NULL)
            {
                if (q->data == p->data)
                {
                    q->next->prior = q->prior;
                    q->prior->next = q->next;
                    free(q);
                }
                q = q->next;
            }
            p = p->next;
        }
    }
    

    你也需要添加头文件 #include<stdlib.h> 来引入 mallocfree 函数的声明。

    这样修改后,你的代码应该可以正确删除链表中的相同元素了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月16日
  • 已采纳回答 10月8日
  • 创建了问题 10月7日

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?