LINUX多文件实现单链表(C语言)附带Make file

//主函数测试代码

#include"list.h"

int main()
{
    list_t list;
    list_init(&list);
    list_add(&list,10);
    list_add(&list,20);
    list_add(&list,30);
    list_travel(&list);
    list_add_first(&list,40);
    list_add_last(&list,50);
    list_add(&list,45);
    list_travel(&list);
    list_del(&list,40);
    list_travel(&list);
    list_deinit(&list);
    return 0 ;
}
 

//头文件代码

//单链表声明
#ifndef __LIST_H
#define __LIST_H
#include<stdio.h>
#include<stdlib.h>
//节点信息
typedef struct node
{
    int data;//数据
    struct node *next;//下一个节点
}node_t;
//链表信息
typedef struct list
{
    struct node  *head;//头节点
    struct node  *tail;//尾节点
}list_t;

extern void list_init(list_t *list);//初始化
extern void list_deinit(list_t *list);//释放内存
extern void list_travel(list_t *list);//遍历
extern void list_add(list_t *list ,int data);//插入数据
extern void list_add_first(list_t *list,int data);//头插
extern void list_add_last(list_t *list,int data);//尾插
extern void list_del(list_t *list,int data);//删除data数据节点

#endif

//函数实现代码

#include"list.h"

//定义分配内存函数
static node_t * creat_node(int data)
{
    //开辟空间
    node_t *pnew=(node_t *)malloc(sizeof(node_t));
    //初始化
    pnew->data = data;
    pnew->next = NULL;
    return pnew;
}
//初始化
extern void list_init(list_t *list)
{
    //初始化头尾节点
    list->head = creat_node(0);
    list->tail = creat_node(0);
    //初始化指向
    list->head->next = list->tail;
    list->tail->next = NULL;
}
//释放内存
extern void list_deinit(list_t *list)
{
    node_t * pnode = list->head;
    while(pnode)
    {
        node_t * ptemp = pnode->next;//保存当前节点的下一个节点
        free(pnode);//释放当前节点
        pnode = ptemp;
    }
}
//遍历
extern void list_travel(list_t *list)
{
    for(node_t* pnode = list->head;pnode != list->tail;
            pnode =pnode->next )
    {
        node_t* pfirst = pnode;
        node_t* pmid = pfirst->next;
        node_t* plast = pmid->next;
        if(pmid != list->tail)//pmid不指向尾节点就是指向有效节点
        {
            printf("%d ",pmid->data);
        }
    }
    printf("\n");
}
//插入数据
extern void list_add(list_t *list ,int data)
{
    //将数据顺序插入,找到比新数据小于等于的节点做为pmid节点,
    //此节点前面的节点做为pfirst,将节点插入pmid和pfirst中间
    node_t *pnew = creat_node(data);
    for(node_t* pnode = list->head;pnode != list->tail;
            pnode =pnode->next )
    {
        node_t* pfirst = pnode;
        node_t* pmid = pfirst->next;
        node_t* plast = pmid->next;
        if(pmid->data >=pnew->data ||
                pmid == list->tail)//pmid数据大于新插入节点数据
        {
            pfirst->next = pnew;
            pnew->next = pmid;
            break;
        }
    }

}
//头部插入数据
extern void list_add_first(list_t *list,int data)
{
    //头插数据,将数据插入头结点和头结点next的节点
    //中间,
    node_t *pnew = creat_node(data);
    node_t *ptemp = list->head->next;//备份
    list->head->next = pnew;
    pnew->next = ptemp;
}
//尾部插入数据
extern void list_add_last(list_t *list,int data)
{
    //后插数据,先创建新节点,找到尾节点前面的节点,
    //将数据插入到此节点和尾节点中间
    node_t *pnew = creat_node(data);
    for(node_t* pnode = list->head;pnode != list->tail;
            pnode =pnode->next )
    {
        node_t* pfirst = pnode;
        node_t* pmid = pfirst->next;
        node_t* plast = pmid->next;
        if(pmid == list->tail)//找到最尾节点前的节点
        {
            pfirst->next = pnew;
            pnew->next = pmid;
            break;
        }
    }

}
//删除data数据节点
extern void list_del(list_t *list,int data)
{
    for(node_t* pnode = list->head;pnode != list->tail;
            pnode =pnode->next )
    {
        node_t* pfirst = pnode;
        node_t* pmid = pfirst->next;
        node_t* plast = pmid->next;
        if(pmid->data == data && pmid != list->tail/*不删除尾节点*/)
            //找到最尾节点前的节点
        {
            pfirst->next = plast;
            free(pmid);//释放pmid指向的节点
            break;
        }
    }
    
}

Make file文件内容:注意回车和tab

BIN=list
OBJ=main.o list.o
CC=gcc

$(BIN):$(OBJ)
    $(CC) -o $(BIN) $(OBJ)

%.o:%.c
    $(CC) -c -o $@ $<

clean:
    rm $(BIN) $(OBJ)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值