数据结构与算法 第三天单向循环链表结构体指针操作

数据结构与算法 第三天单向链表结构体指针操作

  • 第一章 单向链表图文分析
  • 第二章 单向链表代码实现

第一章 单向链表图文分析

数据结构与算法 第三天单向循环链表结构体指针操作_第1张图片

第二章 单向链表代码实现


#include 
#include 
#include 

typedef struct list_node{
    int data;
    struct list_node *next;
}node_t;//链表节点类型

//申请节点空间
node_t *request_link_list_node(void)
{
    node_t *new_node;

    new_node = malloc(sizeof(node_t));
    if(new_node == NULL)
    {
        perror("申请链表节点失败");
        return NULL;
    }

    new_node->next = NULL;

    return new_node;
}
/*
    函数功能:
        将insert_node这个节点插入到refer_node这个节点之后的位置
    参数:
        refer_node:是链表中的任意一个节点
        insert_node:需要插入的节点
    返回值:
        无
*/
void insert_node_link_list(node_t *refer_node, node_t *insert_node)
{
    insert_node->next = refer_node->next;
    refer_node->next = insert_node;
}

//显示链表内容
void display_link_node_data(node_t *list_head)
{
    node_t *pos;

    printf("链表现有数据:");

    for(pos=list_head->next; pos!=NULL; pos = pos->next)
    {
        printf("%d ", pos->data);
    }

    printf("\n");
}

//判断表格是否为空  成功返回1  失败返回0
bool is_empty(node_t *head)
{
    return head->next == NULL;
}

/*
    函数功能:
        删除refer_node的下一个节点出链表
    参数:
        refer_node:链表当中的任意一个节点
*/
int remove_list_next_node(node_t *refer_node)
{
    if(is_empty(refer_node))
    {
        fprintf(stderr, "表格已经空了\n");//标准出错打印
        return -1;
    }

    node_t *rm_node;

    rm_node = refer_node->next;

    refer_node->next = rm_node->next;

    free(rm_node);//其实就是删除了参考节点的下一个

    return 0;
}

//销毁链表
void destroy_link_list(node_t *list_head)
{
    /*
    node_t *pos;
    node_t *next;

    for(pos=list_head, next=pos->next; pos!=NULL; pos = next, next=next->next)
    {
        printf("free %d \n", pos->data);
        free(pos);

        if(next == NULL)//如果没有下一个需要销毁的节点,这立即退出
            break;
    }

    */

    node_t *pos;

    while(!is_empty(list_head))
    {
        printf("free %d\n", list_head->next->data);
        remove_list_next_node(list_head);//删除指定节点的下一个节点(永远删除头节点的下一个节点)
    }

    free(list_head);
}

int main(void)
{
    int input_value;
    node_t *list_head, *new_node;

    //新建头节点
    list_head = request_link_list_node();
    if(list_head == NULL)
        return -1;
    
    list_head->data = -1;//头结点也给一个值

    while(1)
    {
        scanf("%d", &input_value);

        if(input_value > 0)
        {

            //新建节点
            new_node = request_link_list_node();

            new_node->data = input_value;

            //将节点插入到表格当中
            insert_node_link_list(list_head, new_node);

            //打印表格当中的数据
            display_link_node_data(list_head);
        }
        else if(input_value < 0)
        {
            //删除头节点之后的节点数据
            remove_list_next_node(list_head);
            //打印表格当中的数据
            display_link_node_data(list_head);
        }
        else
            break;
    }

    //销毁表格
    destroy_link_list(list_head);

    return 0;
}

数据结构与算法 第三天单向循环链表结构体指针操作_第2张图片

你可能感兴趣的:(数据结构与算法工程师课程,数据结构,算法,链表,开发语言,单向链表)