C语言企业级单向链表——只维护地址域

//区别在于只维护地址域,内存释放需要用户自己来完成
#include <stdio.h>
#include <stdlib.h>

typedef struct Linknode
{
    struct Linknode *next;
}Linknodes;

typedef struct LinkList
{
    Linknodes *p_head;
    int length;
}LinkLists;

typedef struct node {
    Linknodes *List_node;
    int id;
    int age;
    char name[20];
} nodes;


typedef void* LList;//向用户封装数据
LList LinkList_Init();
void Insert_Linklist(LList p_node, LList value_in);
void Insert_pos_Linklist(LList p_node, int pos, LList value_in);
void Foreach_LinkList(LList p_node, void(*my_printf)(void*));
void my_printf1(void* node_in);
void Remove_pos_LinkList(LList p_node, int pos);
void Remove_value_LinkList(LList p_node, void* value, int(*my_compare)(void*, void*));
int my_compare1(void* value_in, void* node_in);
void Length_LinkList(LList p_node);
void Clear_LinkList(LList p_node);
void Destory_LinkList(LList p_node);

int main() {
    printf("---开始创建链表---\n");
    LList Link_head = LinkList_Init();
    printf("---链表创建完毕---\n");
    
    nodes n1 = {NULL, 1, 21, "花木兰"};
    nodes n2 = {NULL, 2, 21, "凯皇"};
    nodes n3 = {NULL, 3, 21, "百里守约"};
    nodes n4 = {NULL, 4, 19, "百里玄策"};
    nodes n5 = {NULL, 5, 22, "苏烈"};
    nodes n6 = {NULL, 6, 20, "李信"};

    printf("---开始后插数据--\n");
    Insert_Linklist(Link_head, &n1);
    Insert_Linklist(Link_head, &n2);
    Insert_Linklist(Link_head, &n3);
    Insert_Linklist(Link_head, &n4);
    Insert_Linklist(Link_head, &n5);
    printf("---后插数据完毕---\n");
    Foreach_LinkList(Link_head, my_printf1);
    Length_LinkList(Link_head);

    printf("---开始在特定位置插入数据--\n");
    Insert_pos_Linklist(Link_head, 1, &n6);
    printf("---在特定位置插入数据完毕---\n");
    Foreach_LinkList(Link_head, my_printf1);
    Length_LinkList(Link_head);

    printf("---开始在特定位置删除数据--\n");
    Remove_pos_LinkList(Link_head, 0);
    printf("---在特定位置删除数据完毕---\n");
    Foreach_LinkList(Link_head, my_printf1);
    Length_LinkList(Link_head);

    printf("---开始在特定数值删除数据---\n");
    int id_temp = 3;
    Remove_value_LinkList(Link_head, &id_temp, my_compare1);
    printf("---在特定数值删除数据完毕---\n");
    Foreach_LinkList(Link_head, my_printf1);
    Length_LinkList(Link_head);

    printf("---开始清空链表---\n");
    Clear_LinkList(Link_head);
    printf("---清空链表完毕---\n");
    Foreach_LinkList(Link_head, my_printf1);
    Length_LinkList(Link_head);

    printf("---开始销毁链表---\n");
    Destory_LinkList(Link_head);
    Link_head = NULL;
    printf("---销毁链表完毕---\n");
    Foreach_LinkList(Link_head, my_printf1);

    system("pause");
    return 0;
}

LList LinkList_Init() {
    LinkLists *Link_head = (LinkLists*)malloc(sizeof(LinkLists));
    Link_head -> p_head  = (Linknodes *)malloc(sizeof(Linknodes));
    Link_head -> p_head -> next = NULL;
    Link_head -> length = 0;
    return Link_head;
}

void Insert_Linklist(LList p_node, LList value_in) {
    if(p_node == NULL)
        return;
    LinkLists *node_head = (LinkLists *)p_node;
    Linknodes *p_current = node_head -> p_head;
    while(p_current -> next != NULL) {
        p_current = p_current -> next;
    }
    //Linknodes *new_node = (Linknodes*)malloc(sizeof(Linknodes));
    Linknodes *my_node = (Linknodes *)value_in;
    //new_node -> next = my_node;
    p_current -> next = my_node;
    node_head -> length ++;
}

void Insert_pos_Linklist(LList p_node, int pos, LList value_in) {
    if(p_node == NULL)
        return;
    LinkLists *node_head = (LinkLists *)p_node;
    if(pos < 0 || pos >= node_head -> length) {
        Insert_Linklist(p_node, value_in);
        return;
    }
    //Linknodes *new_node = (Linknodes*)malloc(sizeof(Linknodes));
    Linknodes *my_node = (Linknodes *)value_in;
    //new_node -> next = my_node;
    Linknodes *p_current = node_head -> p_head -> next;
    Linknodes *p_privious = node_head -> p_head;
    int temp = 0;
    while(p_current != NULL) {
        if (temp == pos) {
            p_privious -> next = my_node;
            my_node -> next = p_current;
            break;
        } else {
            p_privious = p_current;
            p_current = p_current -> next;
        }
        temp ++;
    }
    node_head -> length ++;
}

void Foreach_LinkList(LList p_node, void(*my_printf)(void*)) {
    if(p_node == NULL)
        return;
    LinkLists *node_head = (LinkLists *)p_node;
    Linknodes *p_currut = node_head -> p_head -> next;
    while(p_currut != NULL) {
        my_printf(p_currut);
        p_currut = p_currut -> next;
    }
}

void my_printf1(void* node_in) {
    if(node_in == NULL)
        return;
    nodes* s_node = (nodes* )node_in;
    printf("ID:%d 姓名:%s, 年龄:%d\n", s_node -> id, s_node -> name, s_node -> age);
}

void Remove_pos_LinkList(LList p_node, int pos) {
    if(p_node == NULL)
        return;
    LinkLists *node_head= (LinkLists *)p_node;
    Linknodes *p_current = node_head -> p_head -> next;
    Linknodes *p_privious = node_head -> p_head;
    int temp = 0;
    if(pos < 0 || pos >= node_head -> length)
        return;
    while(p_current != NULL) {
        if(pos == temp) {
            p_privious -> next = p_current -> next;
            //free(p_current);
            node_head -> length --;
            break;
        } else {
            p_privious = p_current;
            p_current = p_current -> next;
        }
    }
}

void Remove_value_LinkList(LList p_node, void* value, int(*my_compare)(void*, void*)) {
    if(p_node == NULL)
        return;
    LinkLists *node_head= (LinkLists *)p_node;
    Linknodes *p_current = node_head -> p_head -> next;
    Linknodes *p_privious = node_head -> p_head;
    while(p_current != NULL) {
        if(my_compare(value, p_current)) {
            p_privious -> next = p_current -> next;
            //free(p_current);
            node_head -> length --;
            break;
        } else {
            p_privious = p_current;
            p_current = p_current -> next;
        }
    }
}

int my_compare1(void *value_in, void *node_in) {
    int *p1 = (int *)value_in;
    nodes *p2 = (nodes* )node_in;
    if(*p1 == p2 -> id)
        return 1;
    else
        return 0;
}

void Length_LinkList(void *p_node) {
    if(p_node == NULL)
        return;
    LinkLists *node_head = (LinkLists *)p_node;
    int length = node_head -> length;
    printf("链表的长度为%d\n", length);
}

void Clear_LinkList(void *p_node) {
    if(p_node == NULL)
        return;
    LinkLists *node_head = (LinkLists *)p_node;
    //Linknodes *p_current = node_head ->p_head -> next;
    //while(p_current != NULL) {
        //Linknodes *p_save = p_current -> next;
        //free(p_current);
        //p_current = p_save;
    //}
    node_head -> p_head -> next = NULL;
    node_head -> length = 0;
}

void Destory_LinkList(void *p_node) {
    if(p_node == NULL)
        return;
    Clear_LinkList(p_node);
    LinkLists *node_head = (LinkLists *)p_node;
    //free(node_head -> p_head);
    free(node_head);
    p_node = NULL;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值