单链表

有关单链表的一些函数即注意事项。

单链表常用函数

//单链表函数
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))是合法的,但它并不给结构体分配足够的空间,只给指针分配一个空间。
文章作者: Zepeng Wang
文章链接: http://yoursite.com/2019/01/25/单链表/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 王小鹏's Blog