双链表删除某个位置的结点时出现的问题
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题在于链表创建,prior指针没赋值,修改以后,程序正常运行
创建函数的几个问题:
尾部插入,和头部插入,题主还没区分,甚至将他们混淆
我很奇怪,既然是双向链表,却忽略prior指针,
应该是在声明
函数的时候,第一个形参的类型搞错了,
相应的,main()中
传实参的时候错了
你试试吧,手机打字没有编译器,不行再回复