通用链表就是用一个共同的节点指针来操作不同的结构体数,不同的链表数据结构不同,但是可以共用链表操作函数,通用链表思维图如下:
通用链表操作代码和使用demo如下:
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linklist.h"
typedef struct _Teacher
{
LinkListNode node;
int age;
char name[32];
char course[32];
}Teacher;
int main(int argc, char argv[])
{
int ret = 0,i = 0;
LinkList *list = NULL;
Teacher t1 = {NULL,31,"zhangsan","Chinese"};
Teacher t2 = {NULL,32,"lisi","Math"};
Teacher t3 = {NULL,33,"wangwu","English"};
list = LinkList_Create();
if(list == NULL)
{
return -1;
}
//向链表中插入函数
ret = LinkList_Insert(list,(LinkListNode*)&t1 , LinkList_Length(list));
ret = LinkList_Insert(list,(LinkListNode*)&t2 , LinkList_Length(list));
ret = LinkList_Insert(list,(LinkListNode*)&t3 , LinkList_Length(list));
//遍历链表
for(i = 0; i < LinkList_Length(list); i++)
{
Teacher *tmp = (Teacher *)LinkList_Get(list,i);
if(tmp == NULL)
{
return -1;
}
printf("age=%d, name=%s, course=%s\n",tmp->age,tmp->name,tmp->course);
}
//链表删除
while(LinkList_Length(list) > 0)
{
Teacher *tmp = (Teacher *)LinkList_Delete(list,0);
if(tmp == NULL)
{
return -1;
}
}
LinkList_Destroy(list);
return 0;
}
linklist.h
#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_
typedef void LinkList;
/*
typedef struct _tag_LinkListNode LinkListNode;
struct _tag_LinkListNode
{
LinkListNode* next;
};
*/
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode;
//创建链表
LinkList* LinkList_Create();
//销毁链表
void LinkList_Destroy(LinkList* list);
//清空链表
void LinkList_Clear(LinkList* list);
//获取链表长度
int LinkList_Length(LinkList* list);
//向链表的某一个位置插入数据
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
//从链表的某一位置获取数据
LinkListNode* LinkList_Get(LinkList* list, int pos);
//从链表的某一位置删除数据
LinkListNode* LinkList_Delete(LinkList* list,int pos);
#endif
linklist.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linklist.h"
typedef struct _tag_LinkList
{
LinkListNode header;
int length;
}TLinkList;
//创建链表
LinkList* LinkList_Create(void)
{
TLinkList *ret = (TLinkList *)malloc(sizeof(TLinkList));
if(ret == NULL)
{
return NULL;
}
memset(ret,0,sizeof(TLinkList));
ret->header.next = NULL;
ret->length = 0;
return ret;
}
//销毁链表
void LinkList_Destroy(LinkList* list)
{
if(list != NULL)
{
free(list);
}
return ;
}
//清空链表
void LinkList_Clear(LinkList* list)
{
TLinkList *tlist = (LinkList *)list;
if(tlist == NULL)
{
return;
}
tlist->header.next = NULL;
tlist->length = 0;
return ;
}
//获取链表长度
int LinkList_Length(LinkList* list){
TLinkList *tlist = (LinkList *)list;
if(tlist == NULL)
{
return -1;
}
return tlist->length;
}
//向链表的某一个位置插入数据
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
int ret = 0,i = 0;
LinkListNode *current = NULL;
TLinkList *tlist = NULL;
tlist = (LinkList *)list;
if(list == NULL || node == NULL || pos < 0)
{
return -1;
}
current = &(tlist->header);
for(i = 0; i < pos; i++)
{
current = current->next;
}
node->next = current->next;
current->next = node;
tlist->length++;
return 0;
}
//从链表的某一位置获取数据
LinkListNode* LinkList_Get(LinkList* list, int pos)
{
int i = 0;
LinkListNode *current = NULL;
TLinkList *tlist = NULL;
tlist = (LinkList *)list;
if(list == NULL || pos < 0)
{
return NULL;
}
current = &(tlist->header);
for(i = 0; i < pos; i++)
{
current = current->next;
}
return current->next;
}
//从链表的某一位置删除数据
LinkListNode* LinkList_Delete(LinkList* list,int pos)
{
int i = 0;
LinkListNode *current = NULL;
LinkListNode *ret = NULL;
TLinkList *tlist = NULL;
tlist = (LinkList *)list;
if(list == NULL || pos < 0)
{
return NULL;
}
current = &(tlist->header);
for(i = 0; i < pos; i++)
{
current = current->next;
}
ret = current->next;
current->next = ret->next;
tlist->length--;
return ret;
}