数据结构链表 --头指针链表复习

来源:互联网 发布:漫画绘图软件免费下载 编辑:程序博客网 时间:2024/05/29 19:48

一、链表的主要功能结构如下:
实现链表有1、头指针链表 2、头节点链表

注:(display函数不需要改变head,只需要将链表数据擦查看,只进行打印就好。所以定义的就是一级指针。)

1、链表的建立分为带头结点的头插法和带头结点的尾插法,第一种方法插入顺序和输出顺序是相反的。第二种方法插入顺序和输出顺序是一致的。这里我们俩种方法介绍 尾插法,头插法
头插法

头插法是使用二级指针,共计俩个大步骤;第一个步骤主要是使用head来操作堆上的数据空间内存;
第二步骤是通过插入函数中的指针操作head指针,从而达到操作堆上存储空间上节点数据的插入;

int Insert (Node**h,int Data){    if(h == NULL)    {        return -1;    }    // 创建新的节点,用于插入    Node*node = (Node*)malloc(sizeof(Node)/sizeof(char));    if(node == NULL)    {        return -1;    }    node->data = data;    node->next = *h;    *h = node;    return 0;}2在尾部插入数据nt Insert_Tail(Node **h, ElementType data){    if (h == NULL)        return ERROR;    // 新建节点    Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));    if (node == NULL)    {        return ERROR;    }    node->data = data;    node->next = NULL;    // 空表    if (*h == NULL)    {        *h = node;    }    else   // 非空表    {        // 找最后一个节点        Node *tmp = *h;   // 指向链表的第一个节点        while(tmp->next)        {            tmp = tmp->next;        }        tmp->next = node;    }    return 0;}

3、 任意位置的插入(新的方法进行任意位置的插入)(只考虑空表状态与非空表状态,然后在空表状态下与空表状态下进行详细的划分,空表状态下插入位置不为1的考虑,非空表状态下要考虑位置为1的插入,然后除去1位置的插入外,还要查找要插入位置的前一个节点,然后进行数据节点的插入)
// 在任意位置插入

int Insert_pos(Node**h,int pos,ElementData data){    Node*node = (Node*)malloc(sizeof(Node)/sizeof(char));    if(node == NULL || pos < 1 )        return -1;    node->data = data;    // 在空表的状态下,只能插入第一个节点处    if(*h ==NULL)    {        if(pos != 1)        {            printf("不能在第%d个位置插入数据\n"pos);            free(node); // 释放空间            return -1;        }        node->next = NULL;        *h = node;    }    else    {            if (pos == 1)  // 插入位置为1        {            node->next = *h;            *h = node;        }        else        {            Node*tmp = *h;            int i;            for(i = 0;i < pos -2;i++)   // 查找要插入位置的前1位置,走的步数            {                // 考虑越界问题                if(tmp == NULL)    // pos值过大会导致越界                    break;                tmp = tmp->next;            }        }        if(tmp == NULL)                {            printf("插入越界\n");        }        node->next = tmp->next;        tmp->next  = node;     }     return0;}4、在任意位置删除数据调用函数int Delete_Pos(Node**h,int pos){       Node*tmp = *h;    if(h == NULL || *h == NULL || pos < 1)     // 进行错误判断        return -1;    else if (pos == 1)  //                                 // 删除位置为1 的地方        {            free(tmp);                                // 将空间释放掉        }    else                                                        // 非空表状态下的删除    {        int i;        for(i = 0;i < pos -2;i++)        {            // 考虑越界问题            if(tmp == NULL)                break;            tmp = tmp->next;        }    }        if(tmp == NULL)    // 判断一下越界问题        {            printf("插入越界\n");        }        Node*p = tmp->next;        tmp->next = p->next;        free(p);     return 0;}

5、链表的逆序操作;
此操作需要使用多指针进行操作;
(1)核心代码
tmp = p->next;
p->next = q;
q= p;
p = tmp;
(2)在核心代码前进行的操
Node *p = (*h)->next;
Node *q = *h;
Node *temp; // 为了进行保存,进行得操作代码区域
int Reverse_List(Node **h)
{
// *h 代表空表 (*h)->next == NULL 只有一个节点
if (h == NULL || *h == NULL || (*h)->next == NULL)
{
return OK;
}

Node *p    = (*h)->next;  Node *q    = *h;Node *temp;            // 为了进行保存,进行得操作while (p){    temp = p->next;    // 将下一个的名字命名为temp;     p->next = q;       // 将p向回指向他的前一个节点,    q = p;             // 指向以后将 q 和p 均前进一步操作,然后在进行操作    p = temp;}// 把第一个节点的下一个节点置为空(*h)->next = NULL;     // 将最初的节点置为空// 重置头指针*h = q;                // 将头指针指向原链表的最后一个return OK;

}
“`

原创粉丝点击