您的位置:首页 > 理论基础 > 数据结构算法

单链表

2017-09-24 12:38 85 查看
链表作为非常常见的一种数据结构,广泛应用于各个场合中。相比于顺序表,它不需要一段连续的内存,而是通过next指向自己的下一个节点。

链表的定义如下:

typedef struct Node

{

    int data;

    struct Node* next;

}Node,*List;

结构是一个数据域,一个next指针。一般来说链表带有头节点会方便很多,所以在初始化时初始一个头节点,数据域不存放数据,next指向NULL.

void InitList(List plist)

{

    assert(plist != NULL);

    if(plist==NULL)

    {

        return ;

    }

    plist->next = NULL;

}

插入分为头插和尾插,但是尾插用的多,因为头插违背生活规律,适用面非常小。需要注意的是,插入时新建的结点必须用动态内存申请,否则无法实现。

bool Insert_head(List plist,int val)

{

    Node *p = (Node *)malloc(sizeof(Node));

    p->data = val;

    p->next = plist->next;

    plist->next = p;

    

    return true;

}

bool Insert_tail(List plist,int val)

{

    for(q=plist;q->next!=NULL;q=q->next);                        //尾节点q标记为q->next==NULL

    Node *p = (Node *)malloc(sizeof(Node));

    p->data = val;                                                                   //将p插在q的后面

    p->next = q->next;//p->next = NULL;

    q->next = p;

    return true;

}

查找函数,返回查找到的节点。

Node* Search(List plist,int key)

{

    Node *p = plist;

    while(p->next != NULL)

    {

        if (p->data == key)

        {

            return p;

        }

        p = p->next;

    }

}

删除指定值的函数

bool Delete(List plist,int key)

{

    Node *p = plist;

    int count = 0;

    while( p->next->data != key)

    {

        p = p->next;

        count++;

        if (p->next == NULL)

        {

            return false;

        }

    }

    p->next = p->next->next;

    return true;

}

判空:

bool IsEmpty(List plist)    //判空

{

    return !GetLength(plist);

}

清空以及销毁:

//清空数据

void Clear(List plist)

{

    plist->next = NULL;

}

//销毁顺序表

void Destroy(List plist)

{

    Clear(plist);

}

获取长度的函数

int GetLength(List plist)    //获取长度

{

    int count = 0;

    for (Node *p = plist; p->next != NULL; p = p->next)

    {

        count++;

    }

    return count;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息