菜鸟求助 C语言链表工具指针的释放
struct pp *delete(struct pp *k,int m)
{
struct pp *s1,*s2,*s3;
int i;
if(k==NULL)
return NULL;
s1=s3=k;
for(i=0;i<m-1;i++)
s3=s3->next;
while(s3->num!=s1->num&&s1->next!=NULL)
{
s2=s1;
s1=s1->next;
}
if(s3->num==s1->num)
{
if(s1==k)
{
s1=s1->next;
k=s1;
}
else
{
s2->next=s1->next;
if(s1->next==NULL)
s2->next=NULL;
}
n=n-1;
printf("delete the number %d data:\
",m);
}
else
printf("no found\
");
free(s1);free(s3);s1=NULL;s3=NULL;
return k;
} 删除程序
tc上通过没问题
下面是插入的 我不是根据内容来插入,而是根据节点的号码来
struct pp *insert(struct pp *b,struct pp *c,int m)
{
struct pp *s1,*s2,*s3,*s4;
int i;
if(m<=0||m>n) return NULL;
else
{
s1=s4=b;
s3=c;
if(b==NULL)
{
b=s3;s3->next=NULL;}
for(i=1;i<m;i++)
s4=s4->next;
while((s4->num!=s1->num)&&s1->next!=NULL)
{
s2=s1;
s1=s1->next;
}
if(s4->num==s1->num)
{
if(s1==b)
{ b=s3;
s3->next=s1;
}
else
{
s2->next=s3;
s3->next=s1;
}
n=n+1;
}
s1=s4=NULL;
return b;
}
}
不知道为什么
不能释放(也就是free(s1),free(s4));一释放虽然能通过但结果却是错的 哪位高手大大能告诉我这个菜鸟着是为什么,同样的工具指针释放在删除的程序那可以成功运行,到了插入这一块就不能,郁闷死我了
答案:你使用的 C 开发平台?
在 C++ 中 new 和 delete 都定义成了操作符
操作符重载 的声明与一般函数不同
如果要和C++兼容还是使用其他字
比如 New 和 Delete
void free(void * ptr) 是 stdlib.h 中定义的标准函数,与
void * calloc(size_t nmemb,size_t size);
void * malloc(size_t size);
void * realloc(void * ptr,size_t size);
对应配合释放空间
你在插入程序中哪里使用 free 了?
插入程序中你没有申请新的 你要释放什么?
程序中使用的 n 是在哪里声明的 作什么用
看了半天你删除函数 也搞不明白你删除的是第m个节点,还是m个节点
要删除一个节点,怎么使用两次 free?
删除函数的功能是肯定不正确
删除没有那么复杂
一、删除第m个节点;指针直接移动m节点,把next链接接到上一节点;释放该节点就ok.
二、删除关键字为m的节点;顺序查找比较关键字,找到后删除;
可能还有其他节点又相同的关键字,两种处理方法,
1 是只删除第一个找到的
2 是删除所有具有相同关键字的节点
bool Delete(struct pp * &k,int m) //删除第m个节点 不需要返回指针,成功 true 失败 false 链表头指针引用传送
{
struct pp *s1,*s3;
int i;
if(m<1||m>n)return false; //要删除的节点不存在 m 从1 计数
if(k==NULL)
return false; //空表
s3=k;
if(m==1){ //删除表头第一个节点
k=k->next;
//k 是指针已用 可以修改
//不能修改 s1 或 s3
n--;
//表长度减1
s3->next=NULL;
free(s3); //释放原第一个节点空间
return true;
}
for(i=1;i<m-1;i++)
s1=s1->next; //找到前一个
s3=s1->next;//s3指向该节点
s1->next=s3->next;//s1->next 指向要删除节点所连的下一个节点
//当 m=n时要删除最后一个节点,该算法仍然工作
//此时 s3-next=NULL
s3->next=NULL;
free(s3);
n--;
return true;
}
在插入函数中
如果你的m是位置,从0计数还是从1计数,
bool insert(struct pp * &b,struct pp *c,int m) //同样链表头指针引用传递
{
struct pp *s4;
int i;
if(m<=0||m>n+1)return false;//插入位置超界
//可以在m= n+1的位置插入
if(m=1){
c=b->next;
b=c;
n++;
return true; //空表插入第一个节点也工作
}
s4=b;
for(i=1;i<m;i++) //找到 m-1的位置
s4=s4->next;
c->next=s4->next; // c->next 指向原 m
s4->next=c;
// (m-1)->next 指向 c
n=n+1;
//表长度加1
}
在编函数是必须首先明确函数要实现的功能,可能遇到的情况和处理方法
上一个:什麽是C语言?难学吗?
下一个:如何才能很好的学习C语言?