数据结构之头指针链表的逆序、输出和指定位置的删除

来源:互联网 发布:小说在线阅读网站 知乎 编辑:程序博客网 时间:2024/05/24 20:07

头指针链表指定位置的删除
实现:1,先判断传入的数据是否正确,然后再判断是否为空表,最后判断pos的值是否满足题意 2,分删除位置为1和不为1讨论:为1时,直接将h指向第二个节点并释放第一个节点的空间(定义一个tmp指向第一个节点);不为1时,找到插入位置的前一个节点(利用tmp遍历),其中需要考虑pos的值是否会造成越界 3,最后删除pos处的节点,注意释放空间防止内存泄漏。

// 删除pos处的节点int Delete_Pos(Node** h, int pos){    // 判断传入数据是否正确、是否为空表、pos是否合题意    if (NULL == h || NULL == *h || pos < 1)    {        return FALSE;    }    Node* tmp = *h;     // 用于保存指针    // 如果删除的第一个    if (1 == pos)    {        *h = tmp->next;         // h指向第二个节点        free(tmp);  // 释放空间    }    else    {        int i;        for (i = 0; i < pos - 2; i++)  // tmp遍历到pos前一个节点        {            // 如果tmp->next不为空,那tmp也不为空            if (NULL == tmp->next)            {                break;            }            tmp = tmp->next;        }        if (NULL == tmp->next)  // 如果tmp->next为空则结束        {            printf ("删除位置越界\n");            return FALSE;        }        Node* p = tmp->next;    // p用来保存删除位置的指针,释放空间用        tmp->next = p->next;    //pos处节点一处链表        free(p);                // 释放删除节点的空间    }    return TRUE;}

头指针链表的逆序
实现:先判断传入数据的正确性,然后判断是否是空表,最后判断是否只有一个节点——从前往后,3个为一组,将前两个指向调换,以此为循环向后遍历直到结束,结束标志为一组中第二个为NULL——最后一步,将逆序后的最后一个指向NULL,头指针 h 指向逆序后的第一个。

// 逆序int Reverse_List(Node** h){    //  *h==NULL代表空表  (*h)->next代表只有一个节点    if (NULL == h || NULL == *h ||NULL == (*h)->next)    {        return FALSE;    }    // 定义3个指针来实现逆序    Node* pre = *h;    Node* cur = (*h)->next;    Node* tmp;    while (cur)             // 从前往后依次逆序    {        tmp = cur->next;        cur->next = pre;        pre = cur;        cur = tmp;    }    // 头尾的处理    (*h)->next = NULL;      // 将第一个节点指向NULL    *h = pre;               // 头指针 h 指向最后一个节点    return TRUE;}

头指针链表的输出

//输出函数void Display(Node* h){    if (NULL == h)      //判断传入数据是否正确    {        return;    }    int count = 0;      //计数初始化    while (h)    {        printf (++count % 4 ? "%8d" : "%8d\n", h->data);        h = h->next;    }    putchar ('\n');}
阅读全文
0 0
原创粉丝点击