头文件
#ifndef _NODE_LIST_H
#define _NODE_LIST_H
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
char id[10];
char name[10];
int age;
}Date;
typedef struct node
{
void *data; //创建无类型指针,指向任何类型的数据
struct node *next;
}node_list;
typedef struct list
{
node_list *head;
int size; //当前链表的大小
//这里没有容量的概念,随用随申请
}link_list;
typedef void (*PRINTF)(void *); //返回值为void,参数为void*的函数指针。
link_list *node_Init();
void Insert_link_list(link_list *list, int pos, void *data);
void removebypos_link_list(link_list *list, int pos) ;
int Size_link_list(link_list *list);
int Find_link_list(link_list *list, void *data) ;
void *First_link_list(link_list *list);
void print_link_list(link_list *list, PRINTF print);
void freespace_link_list(link_list *list);
#endif
链表操作函数
#include "node_list.h"
#include<stdio.h>
/*链表初始化*/
link_list *node_Init()
{
link_list *list;
list = (link_list *)malloc(sizeof(link_list)); //申请空间
list->size = 0;
list->head = (node_list *)malloc(sizeof(node_list)); //为头结点申请空间
list->head->data = NULL; //初始化头结点
list->head->next = NULL;
return list;
}
/*插入数据*/
void Insert_link_list(link_list *list, int pos, void *data)
{
if (list == NULL || data == NULL)
{
return;
}
if (pos < 0 || pos > list->size) //友好处理,如果越界,则插入到尾部
{
pos = list->size;
}
node_list *new_node = (node_list *)malloc(sizeof(node_list)); //创建新的结点
new_node->data = data; //把数据挂到新的结点
new_node->next = NULL; //
node_list *pcurrent = list->head; //创建辅助指针变量找结点
for (int i = 0; i < pos; i++)
{
pcurrent = pcurrent->next;
}
new_node->next = pcurrent->next;
pcurrent->next = new_node;
list->size++;
}
/*根据位置删除链表的元素*/
void removebypos_link_list(link_list *list, int pos)
{
if (list == NULL)
{
return;
}
if (pos<0||pos>=list->size) //位置不合法判断
{
return;
}
node_list *pcurrent=list->head; //查找删除节点的前一个结点
for(int i=0;i<pos;i++)
{
pcurrent=pcurrent->next;
}
node_list *del=pcurrent->next;//创建一个缓存删除的指针记录当前结点
free(del); //释放缓存删除的指针变量
list->size--; //size减少
}
/*返回链表的大小*/
int Size_link_list(link_list *list)
{
if(list==NULL)
{
return -1;
}
return list->size;
}
/*查找数据*/
int Find_link_list(link_list *list, void *data)
{
int i;
if(list==NULL||data==NULL)
{
return -1;
}
node_list *pcurrent=list->head->next;
while(pcurrent!=NULL)
{
if(pcurrent->data==data)
{
break;
}
i++;
pcurrent=pcurrent->next;
}
return i;
}
/*返回第一个结点*/
void *First_link_list(link_list *list)
{
if(list=NULL)
{
return;
}
return list->head->next;
}
/*打印链表元素*/
void print_link_list(link_list *list, PRINTF print)
{
if(list=NULL)
{
return -1;
}
node_list *pcurrent=list->head->next;
printf("okok");
while(pcurrent!=NULL)
{
print(pcurrent->data);
pcurrent = pcurrent->next;
}
}
/*释放链表空间*/
void freespace_link_list(link_list *list)
{
if(list=NULL)
{
return;
}
node_list *pcurrent=list->head;
while(pcurrent!=NULL)
{
node_list *pnext=pcurrent->next;
free(pcurrent);
pcurrent=pnext;
}
list->size=0;
free(list);
}
主函数
#include "node_list.h"
typedef struct Student
{
char name[10];
int years;
char sex[5];
} student;
void my_print(void *data)
{
student *p = (student *)data;
printf("name is: %s age is: %d sex is: %s", p->name, p->years, p->sex);
// printf("%d",p->years);
}
int main()
{
link_list *list = node_Init();
student p1 = {"小明",12,
"男"};
student p2 = {"小凯",10,
"女"};
student p3 = {"小王",19,
"男"};
student p4 = {"二狗子",16,
"男"};
student p5 = {"二蛋",15,
"男"};
student p6 = {"红红",14,
"女"};
student p7 = {"大哥",13,
"男"};
student p8 = {"灭霸",13,
"男"};
Insert_link_list(list, 0, &p1);
/*
Insert_link_list(list, 0, &p2);
Insert_link_list(list, 0, &p3);
Insert_link_list(list, 0, &p4);
Insert_link_list(list, 0, &p5);
Insert_link_list(list, 0, &p6);
Insert_link_list(list, 0, &p7);
Insert_link_list(list, 0, &p8);
*/
//printf("%d",p1.years);
// my_print(list->head->next->data);
print_link_list(list, my_print);
}
makefile
edit:main.o node_list.o
cc -o edit main.o node_list.o
main.o:main.c node_list.h
cc -c main.c
node_list.o:node_list.c node_list.h
cc -c node_list.c
clean:
rm -f node_list.o main.o