C语言链表删除数据的问题,求助!

函数删除链表数据的两种方法,第一种对,第二种错,不知为什么。总觉得两种是一样的啊,请大神们支招!谢谢了方法一:voidDelete(structList*r,intn){... 函数删除链表数据的两种方法,第一种对,第二种错,不知为什么。总觉得两种是一样的啊,请大神们支招!谢谢了
方法一:
void Delete(struct List *r,int n)
{
int i=1;
struct List *p,*q;
q=r;
p=(struct List *)malloc(sizeof(struct List));
while(q->next &&i<n-1)
{
q=q->next ;
i++;
}
if(!(p->next )||(i>n-1))
printf("删除位置出错!");
p=q->next ;
q->next =p->next ;
free(p);

}

方法二:
void Delete(struct List *r,int n)
{
int i=1;
struct List *p,*q;
q=r;
p=(struct List *)malloc(sizeof(struct List));
if(n==1)
{
q=q->next ;
}
else
{
while(q->next&&i<n-1);
{
q=q->next ;
i++;
}
if(i==n-1)
{
p=q->next ;
q->next =p->next ;
free(p);
}
else
printf("删除位置出错!");
}
}
展开
 我来答
slimyhong
2012-11-12 · 超过20用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:49.6万
展开全部
不知你这代码是哪找的,应该都有问题
1、就算代码能删除链表中的元素,但如果要删除链表的第一个元素,这个代码肯定有问题
2、内存泄露
void Delete(struct List *r,int n)
{
int i=1;
struct List *p,*q;
q=r;
p=(struct List *)malloc(sizeof(struct List));//这里申请的空间没有释放!!!其实,这里根本就没必要申请空间,改变链接就可以了
while(q->next &&i<n-1)
{
q=q->next ;
i++;
}
if(!(p->next )||(i>n-1))
printf("删除位置出错!");
p=q->next ;//因为这里改变p指向的位置,所以上面的空间没有释放!!!
q->next =p->next ;
free(p);

}

//我写了个,不知道是不是你要的那种意思
//关于结构体和链表,《C和指针》讲的特别详细
LIST* DeleteItem(LIST* pHead,int pos)
{

LIST* pPrevious = NULL;
LIST* pRemove = pHead;
LIST* pTemp;

//找到要删除的元素
pos --;
while(pRemove && pos)
{
pPrevious = pRemove;
pRemove = pRemove->pNext;
pos --;
}

if(NULL == pRemove)
{
printf("位置错误\n");
return pHead;
}

//删除元素
if(NULL == pPrevious)
{
pTemp = pHead->pNext;
free(pHead);

}
else
{
pTemp = pHead;
pPrevious->pNext = pRemove->pNext;
free(pRemove);
}

return pTemp;}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式