数据结构学习第二天

 H文件

#ifndef LINKLIST_H
#define LINKLIST_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define databytes int
//typedef int databytes;

typedef struct linklist_node_t 
{
    union 
    {
        int len;
        databytes data;
    }msg;
    //struct linklist_node_t *prev;
    struct linklist_node_t *next;
}linklist_t;

linklist_t *linklist_create(void);

void linklist_tail_insert(linklist_t *head, databytes data);
void linklist_head_insert(linklist_t *head, databytes data);
void linklist_insert_after(linklist_t *p, databytes data);

void show_linklist(linklist_t *head);
void delete_one_linklist(linklist_t *head, databytes data);
void delete_tail_linklist(linklist_t *head);
void delete_head_linklist(linklist_t *head);
void delete_linklist_where(linklist_t *head, int pos);

void togging_linklist(linklist_t *head);

void delete_all_linklist(linklist_t *head);

#endif

C文件 

#include "/mnt/share/data/linklist/linklist.h"

/*
 * @brief 创建一个链表
 * @return 链表头指针
 */
linklist_t *linklist_create(void)
{
    
    linklist_t *head = (linklist_t *)malloc(sizeof(linklist_t));
    if(head == NULL)
    {
        printf("malloc failed\n");
        return NULL;
    }
    head->next = NULL;//初始化链表为空
    // head->prev = NULL;
    printf("成功创建一个新的链表,头指针为%p\n", head);
    return head;
}

/*
 * @brief 向链表的头部添加一个节点
 * @param head 链表头指针
 * @param data 节点数据
 */
void linklist_head_insert(linklist_t *head, databytes data)
{
    linklist_t *new_node = (linklist_t *)malloc(sizeof(linklist_t));
    linklist_t *p = head->next;
    if(new_node == NULL)
    {
        printf("malloc failed\n");
        return;
    }
    new_node->msg.data = data;//添加节点数据
    head->msg.len++;//链表长度加1
    new_node->next = head->next;//将新节点的next指针指向原链表的头节点
    head->next = new_node;//将原链表的头节点的next指针指向新节点
    printf("成功向链表头部添加一个节点,首地址由%p变为%p\n", p, new_node);
}

/*
 * @brief 向链表的尾部添加一个节点
 * @param head 链表头指针
 * @param data 节点数据
 * @return 新节点指针
 */
void linklist_tail_insert(linklist_t *head, databytes data)
{
    linklist_t *new_node = (linklist_t *)malloc(sizeof(linklist_t));
    if(new_node == NULL)
    {
        printf("malloc failed\n");
        return ;
    }
    head->msg.len++;
    while(head->next != NULL)
    {
        head = head->next;
    }
    new_node->msg.data = data;
    new_node->next = NULL;
    head->next = new_node;
    printf("成功向链表尾部添加一个节点,%p\n",new_node);
}

/*
 * @brief 在链表的某个节点后插入一个新节点
 * @param head 链表头指针
 * @param p 链表某个节点指针
 * @param data 新节点数据
 * @return 新节点指针
 */
void linklist_insert_after(linklist_t *p, databytes data)
{
    linklist_t *new_node = (linklist_t *)malloc(sizeof(linklist_t));
    if(new_node == NULL)
    {
        printf("malloc failed\n");
        return;
    }
    new_node->msg.data = data;
    new_node->next = p->next;
    p->next = new_node;
    printf("成功在节点%p后插入一个新节点,新节点地址为%p\n", p, new_node);
}

/**
 * @brief 根据位置删除链表中的节点
 * @param head 链表头指针
 * @param pos 要删除的节点位置
 * @return 0表示成功,-1表示失败
 */
void linklist_insert_wherer(linklist_t *head, databytes data, int pos)
{
    int len = head->msg.len;
    if(pos<0 && pos>len-1)
    {
        printf("插入位置不合法\n");
        return;
    }

    if(pos == len-1)
    {
        linklist_tail_insert(head, data);
    }
    else if(pos == 0)
    {
         int i = 0;
        linklist_t *p = head->next;
        linklist_insert_after(p, data);
    }
    else
    {
        int i = 0;
        linklist_t *p = head->next;
        while(i<pos-1)
        {
            p = p->next;
            i++;
        }
        linklist_insert_after(p, data);
    }
}

/*
 * @brief 显示链表中的数据
 * @param head 链表头指针
 */
void show_linklist(linklist_t *head)
{
    int i = 0;
    while(head->next!= NULL)
    {
        i++;
        printf("No.%d\tdata:%d\n", i,(head->next)->msg.data);
        head = head->next;
    }
}
/*
 * 根据内容删除节点
 * @brief 删除链表中的一个节点
 * @param head 链表头指针
 * @param data 节点数据
 */
void delete_one_linklist(linklist_t *head, databytes data)
{
    linklist_t *p = head,*dhead = head;
    
     while(head->next!= NULL && head->next!=p)
    {
        if((head->next)->msg.data == data)
        {
            linklist_t *tmp = head->next;
            head->next = tmp->next;
            free(tmp);
            dhead->msg.len--;
            printf("删除数据:%d的节点:%p成功\n", data, tmp);
            return;
        }
        head = head->next;
    }
    printf("链表中没有该数据\n");
}

void delete_linklist_where(linklist_t *head, int pos)
{
    int len = head->msg.len;
    linklist_t *dhead = head;
    if(pos<0 && pos>len-1)
    {
        printf("删除位置不合法\n");
        return;
    }
    if(pos == 0)
    {
        head->msg.len--;
        delete_head_linklist(head);
    }
    else if(pos == len-1)
    {
        head->msg.len--;
        delete_tail_linklist(head);
    }
    else
    {
        int i = 0;
        linklist_t *p = head->next;
        while(i<pos-1)
        {
            p = p->next;
            i++;
        }
        delete_one_linklist(head, p->msg.data);
        
    }
}

/*
 * @brief 删除链表的头节点
 * @param head 链表头指针
 */
void delete_head_linklist(linklist_t *head)
{
    linklist_t *p = head->next;
    head->next = p->next;
    head->msg.len--;
    free(p);
    printf("删除头节点成功\n");
}

/*
 * @brief 删除链表的尾节点
 * @param head 链表头指针
 */
void delete_tail_linklist(linklist_t *head)
{
    linklist_t *p = head;
    while(head->next->next!= NULL)
    {
        p = head->next;
        head = head->next;
    }
    free(p->next);
    head->msg.len--;
    p->next = NULL;
    printf("删除尾节点成功\n");
}

/*
 * @brief 删除链表中的所有节点
 * @param head 链表头指针
 */
void delete_all_linklist(linklist_t *head)
{
    linklist_t *p = head->next;
    while(p->next!= NULL)
    {
        linklist_t *tmp = p->next;
        free(p);
        p = tmp;
    }
    free(p);
}

/*
 * @brief 翻转链表
 * @param head 链表头指针
 */
void togging_linklist(linklist_t *head)
{
    linklist_t *p = head->next;
    while(p->next!= NULL)
    {
        linklist_t *tmp = p->next;
        p->next = tmp->next;
        tmp->next = head->next;
        head->next = tmp;
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值