c语言数据结构链表问题

void Destory(SLNode **head) //清空函数
{
SLNode *p,*p1;
p=*head;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
*head=NULL; //这行代码是多余了吗?
}

不多余。

该函数参数传入双指针,其本意是要改变传入指针的值。
调用该函数的形式应该是这样:
SLNode *phead;
phead作为头指针作建链表操作,建完后phead的值非NULL;
Destory(&phead);
//此处返回后,phead在Destory内部被改变,即为NULL。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-10
不多余。

第一次循环时, p1=p=*head, p1被free。
即:*head指向的内存空已经被free,这里把*head直接赋值为NULL。可以避免外部由于疏忽访问已经释放的内存空间。
第2个回答  2013-04-10
这条代码并不多余,将指针赋值成空是个良好的习惯。以后再使用此指针时,会先判断指针是否为NULL,如果不是可以表示指针正在被别的程序使用。这样可以减少冲突或存储区丢失等现象。
第3个回答  2013-04-10
不多余....

【数据结构·C语言】请高手帮忙检查一个关于【链表归并】的算法是否正...
1. 您的算法不符合题意,题意是不要创建新的结点就是用原来的空间,所以您 C=(ElemType*)malloc(sizeof(LNode));应该是多余的。2. 您的算法因为AB是递增有序要改为递减有序,您就每次将指针移动到序列的最末端来进行比较和插入,由于是单向链表,这样你的算法会非常低效。3. 您仅仅需要将两个...

关于C语言数据结构单链表初始化的问题
void InitList(LinkList *head);可以实现引用传递参数的功能。在需要函数内部修改链表头指针时,用该形式可以解决该问题。而void InitList(LinkList head) 不可以在函数内部修改链表头指针。

数据结构中C语言的一些问题
这是最简单的链表节点 一个节点由两部分组成 char data 和 node *next next也是指针 这个算法是默认有一个初始头节点的,由r指向。因为只有一个节点 所以自己也是尾节点,r指向它没毛病。 此时r->next =null 你不用关心头节点的data是什么 然后开始循环,给s申请一个新的node节点空间,此...

c语言数据结构的问题,用尾插法建立链表
void creat(linklist L)\/\/L为一级指针,也是头指针{int f = 1;node *s, *r;r = L;while (f) {s = (node*)malloc(sizeof(node));scanf("%s", s->a);if (s->a[0] != '^') {r->next = s;r = s;}else {f = 0;free(s); \/\/ 释放 s}}r->next = NULL; \/\/ ...

【数据结构·C语言】请高手帮忙检查一个关于【链表的归并】算法是否正确...
for (p=&(A.elem[i+1]);p<=&(A.elem[A.length-1]);p++) *(p-1)=*p;这里是要覆盖i+1位置的元素,而根据你自己写的初始条件,p一开始就已经指向i+1位置,因此需要修改,同时伴随修改结束条件,最终修改为for (p=&(A.elem[i+1]);p<&(A.elem[A.length-1]);p++) *p=*(p+1...

c语言链表问题?
输入一个整数,如果不等于-1,就将其添加到链表里。第一个数字输完后,p是指向第一个开辟的地址的。接着将head值赋给last,此时直接跳到else里,head的值为开辟的第一个地址。第二个数字输完后,p指向第二个开辟的地址。接着将head值赋给last,last不为null,但是last->next是null,此时不执行...

初学C语言简单链表的问题,书上说p要指向head才能使用链表,我直接p=&a...
head 是链表规范的写法,p一般做为游动指针,你若这样写结果上是没错的,但是给阅读程序的人带来不便,你要知道,真正的程序代码不是这么几行的,所以基本就约定俗称了链表头有专门的head 表示,你把链表头赋给了p,若在程序的某个地方再次需要操作链表,就需要链表头,只要链表头才能把整个链表联系...

c语言求解 建立链表程序。当输入0时表示链表输入结束,0不计入该链表...
include <stdio.h>#include <stdlib.h>\/\/链表数据结构typedef struct _list{ int n; struct _list *next;}LIST;\/\/创建一个新的节点LIST *list_node_new(int n){ LIST *node; node=malloc(sizeof(LIST)); if(!node) return NULL; node->n=n; node->next=NULL...

数据结构打怪之路 -- 带头双向循环链表的增删查改 (C语言实现)
前言 带头双向循环链表是链表结构中复杂度最高的一种,但其结构带来的优势在于管理数据简单、效率高。此文章将通过C语言实现带头双向循环链表,并展示其在增删查改操作上的优化与应用。一、带头双向循环链表定义 带头双向循环链表具有哨兵位头结点,每个节点存储前一个节点和后一个节点的地址,头结点和尾...

c语言数据结构(双向链表排序)
printf("双向链表中的数据为:\\n");while(p!=L){ printf("%d ",p->data);p=p->next;} printf("\\n");} void Sort(DulLinkList *L){ ElemType temp;DulNode *p,*q;p=(*L)->next;q=(*L)->prior;if(count%2!=0)q=q->prior;p=p->next;while(p!=q){ temp=p->data;p-...

相似回答