//主函数测试代码
#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)