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("删除位置出错!");
}
} 展开
方法一:
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("删除位置出错!");
}
} 展开
展开全部
不知你这代码是哪找的,应该都有问题
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;}
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;}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询