春风吹又生.c 2023-10-09 10:38 采纳率: 54.8%
浏览 5

没报错,但删除函数没调用

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




#include<stdio.h>
#include<stdlib.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指向首元结点(第一个元素)
    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;
    }


}


int main()
{
    int n;

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

    LinkList L= CreateList(n);
    

    PrintList(L);

    delete(L);

    PrintList(L);
    return 0;
}




  • 写回答

2条回答 默认 最新

  • 老僧& 2023-10-09 10:49
    关注

    运行的时候为什么没调用delete函数进行删除操作是因为:删除操作的调用在PrintList(L)之后,而PrintList(L)函数中并没有重新打印链表的内容。
    你首先调用了PrintList(L)来打印链表的内容,然后才调用了delete(L)函数。由于删除操作在打印之后执行,所以你无法看到删除操作的效果,因为链表已经被打印出来,删除操作对链表的修改没有被打印出来。
    你可以将delete(L)函数的调用放在PrintList(L)之前,这样你就可以在删除操作后立即打印链表的内容,查看删除是否成功。

    ```bash
    delete(L);
    PrintList(L);

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 10月9日

悬赏问题

  • ¥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时报错了如何解决?