C 通用单向链表

      通用链表就是用一个共同的节点指针来操作不同的结构体数,不同的链表数据结构不同,但是可以共用链表操作函数,通用链表思维图如下:

 

通用链表操作代码和使用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;
}


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值