本帖最后由 xieglt 于 2020-9-21 11:12 编辑
首先,建立链表的函数有问题DulNode* Creatlist(DataType a[], int n)
{
DulNode* s = NULL;
DulNode* first = (DulNode*)malloc(sizeof(DulNode));
first->prior = NULL;
//first->next 没有初始化为NULL;
first->next = NULL;
for (int i = 0; i < n; i++)
{
s = (DulNode*)malloc(sizeof(DulNode));
s->data = a[i];
s->next=first->next;
first->next = s;
s->prior = first;
}
return first;
}
另外,你的新节点不是建立在链表末尾,而是在第2的位置,也就是first之后的位置
建议这么建立链表,保证新节点在链表末尾DulNode* Creatlist(DataType a[], int n)
{
DulNode* s = NULL;
DulNode* first = (DulNode*)malloc(sizeof(DulNode));
first->prior = NULL;
first->next = NULL;
DulNode * pNode = first;
for (int i = 0; i < n; i++)
{
s = (DulNode*)malloc(sizeof(DulNode));
s->data = a[i];
s->next= NULL;
s->prior = pNode;
pNode->next = s;
pNode = s;
}
return first;
}
删除节点也有点问题int Delete(DulNode* first, int i, DataType* ptr)
{
DulNode* p = first, * q = NULL;
int count = 0;
DataType x;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
//这个逻辑有问题,p != NULL 且 p->next != NULL 时说明链表里至少还有2个节点
//也就是说,至少还有一个元素,为什么不能删除?
if (p == NULL || p->next == NULL)
{
printf("位置错误,删除失败\n"); return 0;
}
else
{
//这个逻辑错了
q = p->next;
*ptr = q->data;
//应该是 *ptr = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
//free错了,删除的节点应该是p,也就是 free(p);
free(q);
//返回值错了,按逻辑应该是1
return 1;
}
}
主函数中的问题
//这个判断有问题,应该是i > 0
if (1 == i)
//这里%后面少了个d
printf("元素中%的元素位置为:%d\n", x, i);
else
printf("双链表中没有元素%d\n", x);
|