为什么delete函数删不了最后一个元素
我的删除函数不能删除最后一个元素那要怎么编写才可以??
# include <stdio.h>
# include <stdlib.h>
typedef struct Dulnode{
int data;
struct Dulnode *prior;
struct Dulnode *next;
}Dulnode,*Dulinklist;
void initlist(Dulinklist *L) //初始化双向链表
{
(*L)=(Dulinklist)malloc(sizeof(Dulnode));
if(!(*L))
printf("无法正常分配空间,对不起哦!\n");
else
{
(*L)->prior=(*L)->next=NULL;
printf("初始化成功!");
}
}
void creatlist(Dulinklist *L) //创建双向链表
{
int n,i;
Dulinklist r,p;//指向尾节点
r=*L;
printf("请问您想输入几个元素:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
p=(Dulinklist)malloc(sizeof(Dulnode));
if(!p)
printf("无法正常分配空间,对不起哦~\n");
else
{
printf("请输入第%d个元素",i+1);
scanf("%d",&p->data);
p->next=r->next;
p->prior=r;
r->next=p;
r=p;
}
}
}
void showlist(Dulinklist *L) //输出双向链表
{
Dulinklist p;
p=(*L)->next;
if((*L)->next==NULL)
printf("双向链表中没有元素,不可以输出哦~\n");
else if((*L)->next!=NULL)
{ printf("该双向链表中的元素为:");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
else
printf("您的线性表不存在哦,不可以显示元素呢~");
printf("\n");
}
int lengthlist(Dulinklist L) //求表长
{
Dulinklist p;
int length=0;
p=L->next;
while(p!=NULL)
{
length++;
p=p->next;
}
printf("您的表长为%d\n",length);
return length;
}
void isemptylist(Dulinklist *L) //判断该双向链表是否为空
{
if((*L)->next==NULL)
printf("您的链表为空。\n");
else
printf("您的链表不为空\n");
}
void destroylist(Dulinklist *L)//销毁链表
{
Dulinklist p,q;
p=*L;
while(p)
{
q=p->next;
free(p);
p=q;
}
printf("已经销毁线性表了哦~\n");
}
void clearlist(Dulinklist *L) //清空线性表
{
Dulinklist p,q;
p=(*L)->next;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
printf("已经清空双向链表了哦~\n");
}
void getelem(Dulinklist *L) //根据查询位置给出元素内容
{
int i,j,e;
Dulinklist p;
printf("请问您想要查询哪一个位置的元素内容:");
scanf("%d",&i);
p=(*L)->next;
j=0;
while(p)
{
++j;
if(i==j)
{
e=p->data;
printf("您查询的位置的元素内容为:%d\n",e);
break;
}
p=p->next;
}
if(i!=j||!p)
printf("您的输入位置有误,无法查询。\n");
}
void locateelem(Dulinklist *L) //根据元素内容查询元素位置
{
int e,j=0;
Dulinklist p;
p=(*L)->next;
printf("请输入您想要查询的元素内容:");
scanf("%d",&e);
while(p)
{
j++;
if(e==p->data)
{
printf("您所要查询的元素内容位于%d号!\n",j);
break;
}
p=p->next;
}
if(!p)
printf("无法查询到元素位置。\n");
}
void insertlist(Dulinklist *L) //在指定元素位置前插入某元素
{
int i,e,j=0;
Dulinklist p,s;
p=(*L);
printf("请问您想要在哪一号元素前插入什么内容:");
scanf("%d,%d",&i,&e);
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
printf("插入位置有误。\n");
else
{
s=(Dulinklist)malloc(sizeof(Dulnode));
if(!s)
printf("分配空间失败,无法进行插入~\n");
else
{
s->data=e;
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
}
}
}
void deletelist(Dulinklist *L)//删除某指定元素并用返回其值
{
int i,j,e;
Dulinklist p,q;
p=(*L);
j=0;
printf("请问您想删除哪一号的元素内容:");
scanf("%d",&i);
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
printf("删除位置有误。\n");
else
{
q=p->next;
e=q->data;
p->next=q->next;
q->next->prior=p;
free(q);
}
}
int main()
{
Dulinklist L;
initlist(&L);
creatlist(&L);
showlist(&L);
isemptylist(&L);
//clearlist(&L);
//isemptylist(&L);
//destroylist(&L);
//showlist(&L);
//getelem(&L);
//locateelem(&L);
lengthlist(L);
insertlist(&L);
showlist(&L);
deletelist(&L);
showlist(&L);
lengthlist(L);
return 0;
}@人造人 初始化成功!请问您想输入几个元素:4
请输入第1个元素0
请输入第2个元素1
请输入第3个元素2
请输入第4个元素3
该双向链表中的元素为:0 1 2 3
您的链表不为空
您的表长为4
请问您想要在哪一号元素前插入什么内容:1
该双向链表中的元素为:-858993460 0 1 2 3
请问您想删除哪一号的元素内容:3
该双向链表中的元素为:-858993460 0 2 3
您的表长为4
请按任意键继续. . .
你的问题是???
人造人 发表于 2018-4-3 09:02
你的问题是???
我现在没问题了这个删除函数。
我现在就还是搞不懂销毁的问题{:10_266:} 人造人 发表于 2018-4-3 09:02
你的问题是???
我之前用单链表可以删除 现在我用双向链表又不可以删除了...
而且我只有最后一个元素不能删除,其他都可以正常删除
这是为什么???是因为是双向链表吗?所以最后一个元素当执行q->next->prior=p语句会出问题吗?
我执行的结果是这样的:见图
# include <stdio.h>
# include <stdlib.h>
typedef struct Dulnode{
int data;
struct Dulnode *prior;
struct Dulnode *next;
}Dulnode,*Dulinklist;
void initlist(Dulinklist *L) //初始化双向链表
{
(*L)=(Dulinklist)malloc(sizeof(Dulnode));
if(!(*L))
printf("无法正常分配空间,对不起哦!\n");
else
{
(*L)->prior=(*L)->next=NULL;
printf("初始化成功!");
}
}
void creatlist(Dulinklist *L) //创建双向链表
{
int n,i;
Dulinklist r,p;//指向尾节点
r=*L;
printf("请问您想输入几个元素:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
p=(Dulinklist)malloc(sizeof(Dulnode));
if(!p)
printf("无法正常分配空间,对不起哦~\n");
else
{
printf("请输入第%d个元素",i+1);
scanf("%d",&p->data);
p->next=NULL;
p->prior=r;
r->next=p;
r=p;
}
}
}
void showlist(Dulinklist *L) //输出双向链表
{
Dulinklist p;
p=(*L)->next;
if((*L)->next==NULL)
printf("双向链表中没有元素,不可以输出哦~\n");
else if((*L)->next!=NULL)
{ printf("该双向链表中的元素为:");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
else
printf("您的线性表不存在哦,不可以显示元素呢~");
printf("\n");
}
int lengthlist(Dulinklist *L) //求表长
{
Dulinklist p;
int length=0;
p=(*L)->next;
while(p!=NULL)
{
length++;
p=p->next;
}
printf("您的表长为%d\n",length);
return length;
}
void isemptylist(Dulinklist *L) //判断该双向链表是否为空
{
if((*L)->next==NULL)
printf("您的链表为空。\n");
else
printf("您的链表不为空\n");
}
void destroylist(Dulinklist *L)//销毁链表
{
Dulinklist p,q;
p=*L;
while(p)
{
q=p->next;
free(p);
p=q;
}
printf("已经销毁线性表了哦~\n");
}
void clearlist(Dulinklist *L) //清空线性表
{
Dulinklist p,q;
p=(*L)->next;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
printf("已经清空双向链表了哦~\n");
}
/*void getelem(Dulinklist *L) //根据查询位置给出元素内容
{
int i,j,e;
Dulinklist p;
printf("请问您想要查询哪一个位置的元素内容:");
scanf("%d",&i);
p=(*L)->next;
j=0;
while(p)
{
++j;
if(i==j)
{
e=p->data;
printf("您查询的位置的元素内容为:%d\n",e);
break;
}
p=p->next;
}
if(i!=j||!p)
printf("您的输入位置有误,无法查询。\n");
}*/
void getelem(Dulinklist *L)
{
int i,j,e;
Dulinklist p;
printf("请问您想要查询哪一个位置的元素内容:");
scanf("%d",&i);
p=(*L),j=0;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
printf("查询位置有误,无法查询\n");
else
{
e=p->data;
printf("您查询的位置的元素是:%d\n",e);
}
}
void locateelem(Dulinklist *L) //根据元素内容查询元素位置
{
int e,j=0;
Dulinklist p;
p=(*L)->next;
printf("请输入您想要查询的元素内容:");
scanf("%d",&e);
while(p)
{
j++;
if(e==p->data)
{
printf("您所要查询的元素内容位于%d号!\n",j);
break;
}
p=p->next;
}
if(!p)
printf("无法查询到元素位置。\n");
}
void insertlist(Dulinklist *L) //在指定元素位置前插入某元素
{
int i,e,j=0;
Dulinklist p,s;
p=(*L);
printf("请问您想要在哪一号元素前插入什么内容:");
scanf("%d,%d",&i,&e);
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
printf("插入位置有误。\n");
else
{
s=(Dulinklist)malloc(sizeof(Dulnode));
if(!s)
printf("分配空间失败,无法进行插入~\n");
else
{
s->data=e;
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
}
}
}
void deletelist(Dulinklist *L)//删除某指定元素并用返回其值
{
int i,j,e,len;
Dulinklist p,q;
p=(*L);
j=0;
printf("请问您想删除哪一号的元素内容:");
scanf("%d",&i);
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
printf("删除位置有误。\n");
else
{
q=p->next;
e=q->data;
p->next=q->next;
q->next->prior=p;
free(q);
}
}
int main()
{
Dulinklist L;
initlist(&L);
creatlist(&L);
showlist(&L);
//isemptylist(&L);
//clearlist(&L);
//isemptylist(&L);
//destroylist(&L);
//showlist(&L);
//getelem(&L);
//locateelem(&L);
lengthlist(&L);
//insertlist(&L);
//showlist(&L);
deletelist(&L);
showlist(&L);
lengthlist(&L);
return 0;
} 愿你 发表于 2018-4-3 21:12
我之前用单链表可以删除 现在我用双向链表又不可以删除了...
而且我只有最后一个元素不能删除,其他都可 ...
# include <stdio.h>
# include <stdlib.h>
typedef struct Dulnode {
int data;
struct Dulnode *prior;
struct Dulnode *next;
}Dulnode, *Dulinklist;
void initlist(Dulinklist *L) //初始化双向链表
{
(*L) = (Dulinklist)malloc(sizeof(Dulnode));
if(!(*L))
printf("无法正常分配空间,对不起哦!\n");
else
{
(*L)->prior = (*L)->next = NULL;
printf("初始化成功!");
(*L)->data = 1234; // debug
}
}
void creatlist(Dulinklist *L) //创建双向链表
{
int n, i;
Dulinklist r, p;//指向尾节点
r = *L;
printf("请问您想输入几个元素:");
scanf("%d", &n);
for(i = 0; i<n; i++)
{
p = (Dulinklist)malloc(sizeof(Dulnode));
if(!p)
printf("无法正常分配空间,对不起哦~\n");
else
{
printf("请输入第%d个元素", i + 1);
scanf("%d", &p->data);
p->next = NULL;
p->prior = r;
r->next = p;
r = p;
}
}
}
void showlist(Dulinklist *L) //输出双向链表
{
Dulinklist p;
p = (*L)->next;
if((*L)->next == NULL)
printf("双向链表中没有元素,不可以输出哦~\n");
else if((*L)->next != NULL)
{
printf("该双向链表中的元素为:");
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}
else
printf("您的线性表不存在哦,不可以显示元素呢~");
printf("\n");
}
int lengthlist(Dulinklist *L) //求表长
{
Dulinklist p;
int length = 0;
p = (*L)->next;
while(p != NULL)
{
length++;
p = p->next;
}
printf("您的表长为%d\n", length);
return length;
}
void isemptylist(Dulinklist *L) //判断该双向链表是否为空
{
if((*L)->next == NULL)
printf("您的链表为空。\n");
else
printf("您的链表不为空\n");
}
void destroylist(Dulinklist *L)//销毁链表
{
Dulinklist p, q;
p = *L;
while(p)
{
q = p->next;
free(p);
p = q;
}
printf("已经销毁线性表了哦~\n");
}
void clearlist(Dulinklist *L) //清空线性表
{
Dulinklist p, q;
p = (*L)->next;
while(p != NULL)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
printf("已经清空双向链表了哦~\n");
}
/*void getelem(Dulinklist *L) //根据查询位置给出元素内容
{
int i,j,e;
Dulinklist p;
printf("请问您想要查询哪一个位置的元素内容:");
scanf("%d",&i);
p=(*L)->next;
j=0;
while(p)
{
++j;
if(i==j)
{
e=p->data;
printf("您查询的位置的元素内容为:%d\n",e);
break;
}
p=p->next;
}
if(i!=j||!p)
printf("您的输入位置有误,无法查询。\n");
}*/
void getelem(Dulinklist *L)
{
int i, j, e;
Dulinklist p;
printf("请问您想要查询哪一个位置的元素内容:");
scanf("%d", &i);
p = (*L), j = 0;
while(p&&j<i)
{
p = p->next;
j++;
}
if(!p || j>i)
printf("查询位置有误,无法查询\n");
else
{
e = p->data;
printf("您查询的位置的元素是:%d\n", e);
}
}
void locateelem(Dulinklist *L) //根据元素内容查询元素位置
{
int e, j = 0;
Dulinklist p;
p = (*L)->next;
printf("请输入您想要查询的元素内容:");
scanf("%d", &e);
while(p)
{
j++;
if(e == p->data)
{
printf("您所要查询的元素内容位于%d号!\n", j);
break;
}
p = p->next;
}
if(!p)
printf("无法查询到元素位置。\n");
}
void insertlist(Dulinklist *L) //在指定元素位置前插入某元素
{
int i, e, j = 0;
Dulinklist p, s;
p = (*L);
printf("请问您想要在哪一号元素前插入什么内容:");
scanf("%d,%d", &i, &e);
while(p&&j<i - 1)
{
p = p->next;
++j;
}
if(!p || j>i - 1)
printf("插入位置有误。\n");
else
{
s = (Dulinklist)malloc(sizeof(Dulnode));
if(!s)
printf("分配空间失败,无法进行插入~\n");
else
{
s->data = e;
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
}
}
}
void deletelist(Dulinklist *L)//删除某指定元素并用返回其值
{
int i, j, e;
Dulinklist p, q;
p = (*L);
j = 0;
printf("请问您想删除哪一号的元素内容:");
scanf("%d", &i);
while(p&&j<i - 1)
{
p = p->next;
++j;
}
if(!p || j>i - 1)
printf("删除位置有误。\n");
else
{
q = p->next;
e = q->data;
p->next = q->next;
if(q->next != NULL)
q->next->prior = p;
free(q);
}
}
int main()
{
Dulinklist L;
initlist(&L);
creatlist(&L);
showlist(&L);
//isemptylist(&L);
//clearlist(&L);
//isemptylist(&L);
//destroylist(&L);
//showlist(&L);
//getelem(&L);
//locateelem(&L);
lengthlist(&L);
//insertlist(&L);
//showlist(&L);
deletelist(&L);
showlist(&L);
lengthlist(&L);
return 0;
}
人造人 发表于 2018-4-3 21:56
我之前用的是这种,但是没出来{:10_266:}
不过你就添加了一句!!!太棒了吧也!!!!{:10_298:}
void deletelist(Dulinklist *L)//删除某指定元素并用返回其值
{
int i,j,e,len;
Dulinklist p,q;
p=(*L);
j=0;
len=lengthlist(&L);
printf("请问您想删除哪一号的元素内容:");
scanf("%d",&i);
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
printf("删除位置有误。\n");
else if(i==len)
{
q=p->next;
e=q->data;
p->next=q->next;
free(q);
}
else
{
q=p->next;
e=q->data;
p->next=q->next;
q->next->prior=p;
free(q);
} 愿你 发表于 2018-4-3 22:02
我之前用的是这种,但是没出来
不过你就添加了一句!!!太棒了吧也!!!!
意思是问题解决了? 愿你 发表于 2018-4-3 22:02
我之前用的是这种,但是没出来
不过你就添加了一句!!!太棒了吧也!!!!
这个结果是调试出来的,要学会调试
^_^
人造人 发表于 2018-4-3 22:05
意思是问题解决了?
对呀你解决了我的问题~ 人造人 发表于 2018-4-3 22:05
这个结果是调试出来的,要学会调试
^_^
我还是没学会调试
我中午找找资源
我之前找过了 都没看到合适的{:10_243:} whx2008 发表于 2018-4-4 23:32
太难啊了!想不到啊!!!
加油{:10_265:} 愿你 发表于 2018-4-16 09:38
我还是没学会调试
我中午找找资源
我之前找过了 都没看到合适的
^_^
页:
[1]