当前位置:编程学习 > C/C++ >>

菜鸟求助 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&lt;1||m&gt;n)return false; //要删除的节点不存在 m 从1 计数

if(k==NULL)

return false; //空表
s3=k;
if(m==1){ //删除表头第一个节点

k=k-&gt;next;
//k 是指针已用 可以修改




//不能修改 s1 或 s3

n--;
//表长度减1

s3-&gt;next=NULL;

free(s3); //释放原第一个节点空间


return true;
}
for(i=1;i&lt;m-1;i++)


s1=s1-&gt;next; //找到前一个

s3=s1-&gt;next;//s3指向该节点
s1-&gt;next=s3-&gt;next;//s1-&gt;next 指向要删除节点所连的下一个节点




//当 m=n时要删除最后一个节点,该算法仍然工作




//此时 s3-next=NULL
s3-&gt;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&lt;=0||m&gt;n+1)return false;//插入位置超界

//可以在m= n+1的位置插入

if(m=1){


c=b-&gt;next;


b=c;


n++;


return true; //空表插入第一个节点也工作

}

s4=b;


for(i=1;i&lt;m;i++) //找到 m-1的位置


s4=s4-&gt;next;

c-&gt;next=s4-&gt;next; // c-&gt;next 指向原 m

s4-&gt;next=c;

// (m-1)-&gt;next 指向 c

n=n+1;

//表长度加1
}

在编函数是必须首先明确函数要实现的功能,可能遇到的情况和处理方法

上一个:什麽是C语言?难学吗?
下一个:如何才能很好的学习C语言?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,