C语言-链表操作

链表的结构创建,初始化,删除和插入操作

/*
链式结构演示
*/ 
#include <stdio.h>
typedef struct node{
        int val; //记录数字 
        struct node *p_next;  //指向下一个结构体 
} node; 
int main() { 
    node node1 = {10}, node2 = {20}, node3 = {30}; 
    node node4 = {25}; 
    node *p_tmp = NULL; 
    node head = {0}, tail = {0}; 
    node1.p_next = &node2; //node1的指针指向node2
    node2.p_next = &node3; //node2的指针指向node3 
    head.p_next = &node1;  //将头节点指向最前面的节点 
    node3.p_next = &tail;  //将原有的最后一个指针指向尾节点,这表示尾节点是最后一个节点 
    //把链式结构的内容从前到后显示在屏幕上 
    for (p_tmp = &head;p_tmp != &tail;p_tmp = p_tmp->p_next) {
        node *p_first = p_tmp; 
        node *p_mid = p_first->p_next; //从第一个有效节点一直指向到最后一个有效节点 
        node *p_last = p_mid->p_next; 
        if (p_mid != &tail && p_mid->val == 20) { 
           p_first->p_next = p_last; //指向p_last的节点,将p_last指向的节点就从物理语句中摘除 
           break; //结束循环 
        }  
    } 
    for (p_tmp = &head;p_tmp != &tail;p_tmp = p_tmp->p_next) {
        node *p_first = p_tmp; 
        node *p_mid = p_first->p_next; //从第一个有效节点一直指向到最后一个有效节点 
        node *p_last = p_mid->p_next; 
        if (p_mid == &tail || node4.val < p_mid->val)   { 
            p_tmp->p_next = &node4; //向后指向新节点 
            node4.p_next = p_mid; //新节点向后指向p_mid指针指向的节点 
            break; // 插入成功后就立刻结束循环 
        } 
    }  
    //把node4插入到链式物理结构里并且把保证前面小后面大 
    for (p_tmp = &head;p_tmp != &tail;p_tmp = p_tmp->p_next) { 
        //指针循环变量p_tmp从头节点开始 
        //向后一次指向每个节点直到最后一个有效节点为止 
        node *p_first = p_tmp; 
        node *p_mid = p_first->p_next; //从第一个有效节点一直指向到最后一个有效节点 
        node *p_last = p_mid->p_next; 
        if (p_mid != &tail) { //p_mid指针不是指向尾节点就一定指向一个有效节点 
            printf("%d ", p_mid->val); //把p_mid指针的节点内容显示在屏幕上 
        } 
    }
    printf("\n"); 
    return 0; 
} 

链表的清空操作

/*
链式物理结构演示
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct node { 
    int val; 
 
    struct node *p_next; 
} node; 
int main() {
    node *p_tmp = NULL;    //指针循环变量
    node *p_node = NULL; //记录动态分配节点的地址 
    node head = {0}, tail = {0}; 
    head.p_next = &tail;  //头节点向后指向尾节点,构成一个空的链式物理结构 
    p_node = (node *)malloc(sizeof(node)); //进行强制类型转换分配在p_node里面 
    if (!p_node) { 
        //处理动态分配内存失败的情况
        free(p_node); 
        p_node = NULL; 
        return 0; 
    }
    //初始化动态分配节点 
    p_node->val = 20; 
    p_node->p_next = NULL; 
    //把新节点加入到空的链式物理结果中
    head.p_next = p_node; 
    p_node->p_next = &tail; 
    //把链式物理结构中所有节点的内容从前向后显示在屏幕上 
    for (p_tmp = &head;p_tmp != &tail;p_tmp = p_tmp->p_next) { 
        node *p_first = p_tmp; 
        node *p_mid = p_first->p_next; 
        node *p_last = p_mid->p_next; 
        if (p_mid != &tail) {
            printf("%d ", p_mid->val);  
        } 
    } 
    printf("\n"); 
    //释放链式物理结构里所有动态分配节点 
    while (head.p_next != &tail) { //头节点里的指针不是指向尾节点就表示链式物理结构里存在有效节点,这个时候循环就继续  
         //每次循环时都删除并释放最前面的有效节点 
         node *p_first = &head; 
         node *p_mid = p_first->p_next; //指向第一个有效节点(就是我们要删除的节点)
         node *p_last = p_mid->p_next; 
         //把第一个有效节点从链式物理结构里摘出来
         p_first->p_next = p_last; 
         //释放p_mid指针指向的节点 
         free(p_mid); 
         p_mid = NULL; 
    } 
    return 0; 
}

猜你喜欢

转载自www.cnblogs.com/hyq-lst/p/12574657.html