双链表删除某个位置的结点时出现的问题

发布于 2022-09-02 20:53:22 字数 2367 浏览 14 评论 0

c语言写的双链表,删除某个位置的结点p,代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct DNode{
    int data;
    struct DNode *prior, *next;  //前驱和后继指针 
}DLNode, *DLinkList;


DLinkList DLinkListCreate(DLinkList &DList) {
    DLNode *p, *r;
    DList = (DLNode *)malloc(sizeof(DLNode));   //申请头结点
    DList->next = NULL;
    r = DList;
    r->next = NULL;     //r指向终端结点指针 
    int x;
    printf("请输入双链表中元素的值,以负数作为结束输入:");
    scanf("%d", &x);
    while(x >= 0) {
        p = (DLNode *)malloc(sizeof(DLNode));
        p->data = x;
        //尾插法 
        p->next = r->next;
        r->next = p;
        r = p;
        scanf("%d", &x);
    } 
    r->next = NULL;
    return DList;
}

DLinkList printDLink(DLinkList DList) {
    DLNode *p;
    p = DList->next;
    printf("打印双链表:");
    for(p; p != NULL; p = p->next) {
        printf("%6d", p->data);
    }
    printf("\n");
} 

int DLinkLen(DLinkList DList) {
    int n = 0;
    DLNode *p;
    p = DList->next;
    for(p; p != NULL; p = p->next) {
        n++;
    }
    return n;
}

DLNode *GetElemP(DLinkList DList, int i) {
    int j;
    DLNode *p;
    p = DList;
    for(j = 1; j <= i; j++) {
        p = p->next;
    }
    return p;
}

//删除某个位置的结点p 
int deleteDLIndex(DLinkList &DList, int delLocate) {
    DLNode *p, *q;
    if(delLocate < 1 || delLocate > DLinkLen(DList)) {
        printf("删除位置不合适");
        return -1;    //删除位置不合适
    }
    p = GetElemP(DList, delLocate);
    if(!p) {
        printf("p获取失败 ");
        return -1;     //p获取失败 
    }    
    p->prior->next = p->next;
    p->next->prior = p->prior;
    free(p);
    printf("该位置上的元素已经删除\n");
}

int main() {
    DLinkList DList;
    DLinkListCreate(DList);
    printf("双链表建立完成\n");
    printDLink(DList);
    
    int length;
    length = DLinkLen(DList);
    printf("该双链表的长度: %d\n", length);
    
    int delLocate;
    printf("删除某个位置上的元素\n");
    printf("请输入想要删除的位置: ");
    scanf("%d", &delLocate);
    deleteDLIndex(DList, delLocate);
    printDLink(DList);
}

在运行时,删除某个位置结点后,该位置会出现一个奇怪的数字,比如在删除第三个结点时,会出现:11343672
图片描述

个人觉得应该和链表指向的内存地址有关,可是具体怎么修改又不清楚。请问下为什么会出现这种情况?代码应该怎样修改才能避免出现这样的情况?谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烟织青萝梦 2022-09-09 20:53:22

问题在于链表创建,prior指针没赋值,修改以后,程序正常运行

DLinkList DLinkListCreate(DLinkList &DList) {
    DLNode *p, *r;
    DList = (DLNode *)malloc(sizeof(DLNode));   //申请头结点
    DList->next = NULL;
    DList->prior = NULL;
    r = DList;
   // r->next = NULL;     //r指向终端结点指针 
    int x;
    printf("请输入双链表中元素的值,以负数作为结束输入:");
    scanf("%d", &x);
    while(x >= 0) {
        p = (DLNode *)malloc(sizeof(DLNode));
        p->data = x; 
        p->next = 0;     
        p->prior = r;
        //尾插法 
        r->next = p;
        r = p;

        scanf("%d", &x);
    } 

    return DList;
}

创建函数的几个问题:
尾部插入,和头部插入,题主还没区分,甚至将他们混淆
我很奇怪,既然是双向链表,却忽略prior指针,

沧桑㈠ 2022-09-09 20:53:22

应该是在声明

int deleteDLIndex(DLinkList &DList, int delLocate)

函数的时候,第一个形参的类型搞错了,

int deleteDLIndex(DLinkList DList, int delLocate)

相应的,main()中

deleteDLIndex(DList, delLocate);

传实参的时候错了

deleteDLIndex(&DList, delLocate);

你试试吧,手机打字没有编译器,不行再回复

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文