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

查看:115
本文介绍了c - 双链表删除某个位置的结点时出现的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

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

解决方案

问题在于链表创建,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指针,

这篇关于c - 双链表删除某个位置的结点时出现的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆