用C语言编写程序:清空一个带头结点的链表 .

如题所述

typedef int status;
typedef int Elemtype;
const int ok=1;
const int error=0;
const int overflow=-2;
const int TRUE=1;
const int FALSE=0;

typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*Linklist; //定义单链表的结点类型;

status initlist(Linklist &L) //初始化单链表;
{
L=(Linklist) malloc(sizeof(LNode));
if(!L) exit(overflow);
L->next=NULL;

//TODO1 生成单链表的头结点;

return ok;
}

status destroylist(Linklist &L) //销毁单链表;
{ while(L)
{ Linklist p=L->next;
free(L);
L=p;
}
//TODO2

return ok;
}

status listempty(Linklist &L) //判断单链表是否为空;
{ if(L->next==NULL)
return TRUE;
else return FALSE;
//TODO3

return TRUE;

}

int listlength(Linklist L) //求单链表的长度;
{ Linklist p=L->next;
int i=0;
while(p)

return i;
//TODO4

//p先指向第一个结点;
//计数器清0;
//当p所指向的结点存在,计数器加1,同时指针下移;
//while语句结束时,p移出单链表;
//返回单链表的长度;

}

void clearlist(Linklist &L) //清空单链表;
{while (L->next) {
Linklist p=L->next; L->next=p->next;

}

//TODO5
}

void printlist(Linklist L) //输出单链表里的每一个结点;
{
Linklist
p=L->next;
while(p)
{printf("%d",p->data);
p=p->next;
}
//TODO6
//p指向头结点;
//当p指向的结点存在,输出该结点,同时指针下移;

}

status getelem(Linklist L,int i,Elemtype &e)//取表中第i个元素放到变量e里;
{ Linklist p=L->next; int j=1;
while(p&&j<i)
e=p->data;
if(!p||j>i) return error;

//TODO7

//p首先指向第一个元素

//while语句结束时,如果第i个结点存在,p指向它;
//否则p指向表尾;

//表中不存在第i个结点或者表为空,返回出错信息;

}

status listinsert(Linklist &L,int i,Elemtype e)//向表中第i个元素的前面插入元素e;
{ Linklist p = L; int j = 0;
while (p && j < i-1)
// 寻找第 (i-1) 个结点
if (!p || j > i-1)
return error;
else
//TODO8
//p首先指向头结点;
//如果第i个结点存在,while语句结束时,p指向第i-1个结点;
//否则p指向表尾;
//生成新的结点;

//新的结点插入到p指向结点的后面(也就是插入到第i个结点的前面);

return ok;
}

status listdelete(Linklist &L,int i,Elemtype &e)//删除表L中第i个元素,结果用e返回. 操作成功返回ok,失败时返回error
{Linklist p = L; int j = 0;
while (p->next && j < i-1)
// 寻找第 i-1 个结点,并令 p 指向它。
if (p->next&& j == i-1)
{Linklist q = p->next; p->next = q->next; // 删除并释放结点
e = q->data; free(q);}
return ok;

//TODO9

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-07
得到头结点后,你可以创建两个指针存放,一个存放当前节点,一个存放当前的下一个。然后free掉当前节点后,该指针存放下一个。
例如,Node为结点
struct Node{
int data;
Node *next;
}
Node *cur = head -> next;
Node *next = cur->next;
while(cur != null)
{
free(cur);
cur = next;
next = next->next;
}

基本思路就是这样。可能有点语法错误,没有编译器。。希望对你有所帮助。
第2个回答  2011-01-07
先把节点指向的地址记录下来,然后把节点删了
然后再把下一个节点指向的地址记录下来,再把节点删了。。。。。。
第3个回答  2011-01-07
0