扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
链表的清空操作,就是要销毁掉除表头结点之外的所有结点。只要写个循环来销毁结点就可以,注意,要先记录当前结点的后继结点,然后再销毁当前结点。
公司主营业务:成都网站建设、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出双辽免费做网站回馈大家。
参考代码:
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct SqList{
ElemType elem;
struct SqList *next;
}SqList;
int ClearList(SqList *list)
{
SqList *temp, *head = list;
if (list == NULL)
return ERROR;
list = list-next;
while (list != NULL)
{
temp = list-next;
free(list);
list = temp;
}
head-next = NULL;
return OK;
}
到底是问链表还是数列呀?
可以这样写,传入的是头指针
void DeleteList(LIST* head)
{
LIST* tmp;
tmp = head;
while(tmp!=NULL)
{
head = tmp-next;
free(tmp);
tmp = head;
}
}
递归算菲数列的
long fi(int n)
{
if (n==1||n==2) return 1;
return fi(n-1)+fi(n-2);
}
其实用递归算菲波拉契数列很慢的,很快就栈溢出了。
你这个销毁函数本身没有问题,它是正确的,问题产生的根源在你的链表生成函数。
你的链表生成函数的入参是一个指针,作为形参,你能改变它指向的东西,但是不能改变形参本身体。也就是说,你在链表创建函数类生成了链表,但是出了这个函数,实参并没有指向你生成的这个链表。你的list仅仅是一个链表元素,你的程序里,它并不是动态生成的,而是一个局部变量,这时候你去free释放它,就会报错。
修改很简单,把创建函数参数改成指向指针的指针。如下:
#includestdio.h
#includestdlib.h
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreatList_L(LinkList *L, int n);//参数改成LinkList 的指针,对链表元素来说,就是指针的指针
void DestoryList_L(LNode* L);//正确的,不需要修改
int main()
{
//LNode list;//这个可以不要
LNode *pList = NULL;//直接声明一个
指针就可以 ,调用CreatList_L之后,pList 就会指向你动态生成的链表了。
CreatList_L(pList,3); //传入指针地址
DestoryList_L(pList);
}
void CreatList_L(LinkList *L, int n) {
LNode *p,*r;
int i;
*L=(LinkList)malloc(sizeof(struct LNode)); //注意要对L解引用
if(*L==NULL)
exit(1);
(*L)-next=NULL;
p=r=(*L);
for(i=0;in;i++)
{
p=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",p-data);
p-next=NULL;
r-next=p;
r=p;
}
for(p=(*L)-next;p!=NULL;p=p-next)
printf("%-5d",p-data);
printf("\n");
}
void DestoryList_L(LNode* L)
{
LNode *p; int n=0;
while(L)
{
p=L;
L=L-next;
free(p);
n++;
}
printf("%d\n",n);
}
运行截图:
你的n输出有问题,应该是n-1
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流