Linux:实现一个链表

代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

//定义节点数据类型
struct link_node
{
    int num;
    struct link_node * next;
};

struct link_node * initial_linklist();
void reverse_linklist(struct link_node * pHeader);
void insert_linklist(struct link_node * pHeader, int olddata, int newdata);
void delete_linklist(struct link_node * pHeader, int olddata);
void print_linklist(struct link_node * pHeader);
void clean_linklist(struct link_node * pHeader);
void destroy_linklist(struct link_node * pHeader);

struct link_node * initial_linklist()
{
    struct link_node * pHeader = malloc(sizeof(struct link_node));
    if(pHeader == NULL) return NULL;
    return pHeader;
};

void reverse_linklist(struct link_node * pHeader)
{
    if(pHeader == NULL)
    {
        //printf("pHeader == NULL\n");
        return;
    }
    //printf("pHeader != NULL\n");
    struct link_node * pPrv = NULL;
    struct link_node * pCurrent = pHeader->next;
    struct link_node * pNext = NULL;    
    while (pCurrent != NULL)
    {   
        //pNext指向原来的顺序的下一个
        pNext = pCurrent->next;
        //pCurrent反向
        pCurrent->next = pPrv;
        //一起往下移动
        pPrv = pCurrent;
        pCurrent = pNext;
    }
    pHeader->next = pPrv; 
};
void print_linklist(struct link_node * pHeader)
{
    if(pHeader == NULL)
    {
        return;
    }
    //头节点不保存数据,从头节点的next指向的节点开始打印
    struct link_node * pCurrent = pHeader->next;
    while (pCurrent != NULL)
    {
        printf("%d\n",pCurrent->num);
        pCurrent = pCurrent->next;
    }
    //if(pCurrent == NULL) return;
};

void insert_linklist(struct link_node * pHeader, int olddata, int newdata)
{
    if(pHeader == NULL)
    {
        return;
    }

    struct link_node * pPrv = pHeader;
    struct link_node * pCurrent = pHeader->next;

    while (pCurrent != NULL)
    {
        if(pCurrent->num == olddata) break;
        pPrv = pCurrent;
        pCurrent = pCurrent->next;

    }
    
    struct link_node * pNewlink = malloc(sizeof(struct link_node));
    pNewlink->num = newdata;
    pNewlink->next = pCurrent;
    pPrv->next = pNewlink;
    
}

void delete_linklist(struct link_node * pHeader, int olddata)
{
    if(pHeader == NULL)
    {
        return;
    }
    struct link_node * pPrv = pHeader;
    struct link_node * pCurrent = pHeader->next;

    while (pCurrent != NULL)
    {
        if(pCurrent->num == olddata) break;
        pPrv = pCurrent;
        pCurrent = pCurrent->next;

    }
    pPrv->next = pCurrent->next;
    free(pCurrent);
};

void clean_linklist(struct link_node * pHeader)
{
    if(pHeader == NULL)
    {
        return;
    }

    struct link_node * pCurrent = pHeader->next;
    while (pCurrent != NULL)
    {
        pHeader->next = pCurrent->next;
        free(pCurrent);
        pCurrent = pHeader->next;
    }
    pHeader->next = NULL;
};

void destroy_linklist(struct link_node * pHeader)
{
    if(pHeader == NULL)
    {
        return;
    }
    clean_linklist(pHeader);
    free(pHeader);
    pHeader = NULL;
};

void main(void * argc, void * argv[])
{
    struct link_node * pHeader = initial_linklist();
    printf("inser 3 nodes\n");
    insert_linklist(pHeader, -1, 10);
    insert_linklist(pHeader, -1, 20);
    insert_linklist(pHeader, -1, 30);
    print_linklist(pHeader);

    printf("inser more 3 nodes\n");
    insert_linklist(pHeader, 10, 100);
    insert_linklist(pHeader, 20, 200);
    insert_linklist(pHeader, 30, 300);
    print_linklist(pHeader);

    printf("remove 3 nodes\n");
    delete_linklist(pHeader, 100);
    delete_linklist(pHeader, 20);
    delete_linklist(pHeader, 30);
    print_linklist(pHeader);

    printf("clean link nodes\n");
    clean_linklist(pHeader);
    print_linklist(pHeader);

    printf("insert 3 nodes\n");
    insert_linklist(pHeader, -1, 10);
    insert_linklist(pHeader, -1, 20);
    insert_linklist(pHeader, -1, 30);
    print_linklist(pHeader);

    printf("destroy link\n");
    destroy_linklist(pHeader);
    pHeader = NULL;/*在主函数中pHeader作为实参,实质是值传递。在子函数中只是把malloc的链表头的地址copy了一份。
    子函数中的pHeader是一个局部变量,和主函数中的pHeader是不同的变量。主函数中的pHeader需要手动置空。*/

    print_linklist(pHeader);

    printf("try to add node after destroy link\n");
    insert_linklist(pHeader, -1, 10);
    printf("try to print node after destroy link\n");
    print_linklist(pHeader);

}

结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值