有关单链表的一些函数即注意事项。
单链表常用函数
//单链表函数
struct node
{
ElementType Element;
LinkNode* next;
} LinkNode;
typedef LinkNode* Position;
//测试一个链表是否为空表
int IsEmpty(List L)
{
return L->next==NULL;
}
//测试当前位置是否是链表的末尾的函数
int IsLast(Position P,List L)
{
return P->next==NULL;
}
//查找一个数的位置
Position Find(Element X,List L)
{
Position p;
p=L->next;
while(p!==NULL&&p->Element!=X)
p=p->next;
return p;
}
//查找一个数的前驱节点的位置
Position FindPrevious(Element X,List L)
{
Position p;
p=L;
while(p->next!=NULL&&p->next->Element!=X)
p=p->next;
return p;
}
//删除表中某个元素
void Delete(Element X,List L)
{
Position p;
p=Find(X,L);
if(!p)
{
Position q=p->next;
s=FindPrevious(X,L);
s->next=q;
free(p);
}
}
//链表的插入(将新元素插入到P位置处之后)
void Insert(Element X,List L,Position P)
{
Position TmpCell;
TmpCell=malloc(sizeof(LinkNode));
TmpCell->Element=X;
TmpCell->next=P->next;
p->next=TmpCell;
}
//删除表
void DeleteList(List L)
{
Position p,q;
p=L->next;
L->next=NULL; //头结点指向空
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
}
常见的错误
- “memory access violation”或”segmentation violation”这种错误信息通常意味着有指针变量包含了伪地址。通常的原因是初始化变量失败,比如若P未定义,则其不可能指向内存的有效部分;如果P是NULL,则指向是非法的。
- 何时使用或何时不使用malloc来获取一个新的单元。我们必须记住,声明指向一个结构的指针并不创建该结构,而只是给出足够的空间容纳结构可能会使用的地址。创建尚未被声明过的记录的唯一方法是使用malloc库函数。malloc(HowManyBytes)奇迹般地使系统创建一个新的机构并返回指向该结构的指针。另一方面,如果使用一个指针变量沿着一个表行进,那就没有必要创建新的结构,此时不宜使用malloc命令。
- malloc(sizeof(PtrToNode))是合法的,但它并不给结构体分配足够的空间,只给指针分配一个空间。