节点的结构体定义
struct LinkNode{
struct LinkNode *next;
};
该节点只有一个指针域成员,没有数据域成员。
用户数据需预留4个字节(32位程序)给底层函数使用
链表的结构体定义
struct LList{
struct LinkNode pHeader;
int m_size;
};
泛型指针的重定义
typedef void * LinkList;
1.单向链表的初始化
- 函数设计为
LinkList inintLinkList();
- 该函数初始化链表会返回一个泛型链表
- 初始化内容是动态创建一个链表结构体变量,并初始化里面的成员
LinkList initLinkList()
{
struct LList *myList = malloc(sizeof(struct LList));
if(myList == NULL)
return;
myList->pHeader = NULL;
myList->m_size = 0;
return myList;
}
2.单向链表的节点插入
- 函数设计为
void insertLinkList(LinkList list,int pos,void *data);
pos
为待插入节点的位置,需找到它的前驱节点void *data
用于接收节点数据
void insertLinkList(LinkList list,int pos,void *data)
{
if(list == NULL || data == NULL)
return;
struct LList *myList = list;
if(pos < 0 || pos > myList->m_size - 1)
pos = myList->m_size;
struct LinkNode *pCurrentNode = &myList->pHeader;
//找到待插入节点的前驱节点
for(int i = 0; i < pos; i++)
pCurrentNode = pCurrentNode->next;
struct LinkNode *myNode = data;
//更改指针指向,插入节点
myNode->next = pCurrentNode->next;
pCurrent->next = myNode;
myList->m_size++;
}
3.单向链表的节点遍历打印
- 函数设计为
void foreachLinkList(LinkList list,void(*myPrint)(void*));
myPrint
为函数指针,用于接收用户的回调函数
void foreachLinkList(LinkList list,void(*myPrint)(void*))
{
if(list == NULL)
return NULL;
struct LList *myList = list;
struct LinkNode *myNode = &myList->pHeader;
for(int i = 0; i < myList->m_size; i++)
{
myNode = myNode->next;
myPrint(myNode);
}
}
回调函数的设计
struct Person
{
void *node;
char name[64];
int age;
}
void myPrintPerson(void *data)
{
struct Person *p = data;
printf("姓名:%s 年龄:%d\n",p->name,p->age);
}
4.测试调用
void test()
{
//初始化链表
LinkList myList = initLinkList();
//创建数据
struct Person p1 = {NULL,"aaa",10};
struct Person p2 = {NULL,"bbb",20};
struct Person p3 = {NULL,"ccc",30};
struct Person p4 = {NULL,"ddd",40};
//插入节点
insertLinkList(myList,0,&p1);
insertLinkList(myList,1,&p2);
insertLinkList(myList,2,&p3);
insertLinkList(myList,3,&p4);
foreach(myList,myPrintPerson);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)