栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言实现】 创建可复用单链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言实现】 创建可复用单链表

文章目录
  • LinkList.h
  • main.c
  • LinkList.c
  • 输出:

写的有点怪

//LinkList.h

typedef void LinkList;		//定义链表	
typedef struct tag_LinkListNode LinkListNode;	//定义链表指针域
typedef struct tag_LinkListNode		//定义 指针域的嵌套
{
	LinkListNode* next;			
}LinkListNode;

//	上面用来void,还是做了封装的
******************************************************
//LinkList.c
//定义实际使用的?链表头结点,header是个LinkListNode结构体,内含嵌套指针

typedef struct tag_LinkList
{
	LinkListNode header;
	int length;
}TLinkList;

******************************************************
//main.c
//这里才定义了数值,可能直观点,在主函数才定义数据 
  但也让嵌套多了一层,每个数据Value里面嵌套LinkListNode指针域;
  很多此一举的感觉,回头改成一体的:LinkListNode里直接包含数据(感觉简单一点)
struct Value
{
	LinkListNode header;
	int data;	
};
LinkList.h
#ifndef LINKLIST_H
#define LINKLIST_H

//typedef void ElemType;
typedef void LinkList;		
typedef struct tag_LinkListNode LinkListNode;
typedef struct tag_LinkListNode
{
	ElemType data;
	LinkListNode* next;
}LinkListNode;

//创建链表
LinkList* LinkList_Create();
//获取链表的最大长度 
int LinkList_Capacity(LinkList* list);
//销毁链表
void LinkList_Destroy(LinkList* list); 
//清空链表
void LinkList_Clear(LinkList* list);
//获取链表的长度
int LinkList_Length(LinkList* list);
//元素插入链表;在链表list的pos位置插入新元素node
//返回值为1表示插入成功,0表示插入失败
int LinkList_Insert(LinkList* list,LinkListNode* node,int pos);
//获取链表中某个位置的元素;获取链表list的pos位置处的元素
//返回值为pos位置处的元素,NULL表示获取失败
LinkListNode* LinkList_Get(LinkList* list,int pos); 
//将某个元素从链表中删除;删除链表list的pos位置处的元素
//返回值为删除的元素,NULL表示获取失败
LinkListNode* LinkList_Delete(LinkList* list,int pos);

#endif

main.c

这里用的是头插法建立链表

#include 
#include 
#include "LinkList.h"

struct Value
{
	LinkListNode header;
	int data;	
};

int main(int argc, char *argv[]) 
{
	int i;
	LinkList* list = LinkList_Create();
	//创建元素 
	struct Value v1 ;
	struct Value v2 ;
	struct Value v3 ;
	struct Value v4 ;
	struct Value v5 ;
	//赋值 
	v1.data = 1;
	v2.data = 2;
	v3.data = 3;
	v4.data = 4;
	v5.data = 5;
	//插入元素	
	LinkList_Insert(list,(LinkListNode*)&v1,0);
	LinkList_Insert(list,(LinkListNode*)&v2,0);
	LinkList_Insert(list,(LinkListNode*)&v3,0);
	LinkList_Insert(list,(LinkListNode*)&v4,0);
	LinkList_Insert(list,(LinkListNode*)&v5,0);
	//
	for(i=0;i
		struct Value* pl = (struct Value*)LinkList_Get(list,i);
		
		printf("%dn",pl->data);
	} 
	
	while(LinkList_Length(list) > 0)
	{
		struct Value* pl = (struct Value*)LinkList_Delete(list,LinkList_Length(list)-1);
		
		printf("%dn",pl->data);
	}
	
	LinkList_Destroy(list);
	
	return 0;
}

LinkList.c
#include 
#include 
#include "LinkList.h"


typedef struct tag_LinkList
{
	LinkListNode header;
	int length;
}TLinkList;

//创建链表
LinkList* LinkList_Create() // O(1)
{
    TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
    
    if( ret != NULL )
    {
        ret->length = 0;
        ret->header.next = NULL;
    }
    
    return ret;
}

//销毁链表
void LinkList_Destroy(LinkList* list)
{
	free(list);
}

//清空链表
void LinkList_Clear(LinkList* list)
{
	TLinkList* sList = (TLinkList*)list;	//强制类型转换 
	
	if(sList != NULL)
	{
		sList->length = 0;
		sList->header.next = NULL;	
	} 
}

//获取链表的长度
int LinkList_Length(LinkList* list)
{
	TLinkList* sList = (TLinkList*)list;	//强制类型转换
	int ret = -1;
	
	if(sList != NULL)
	{
		ret = sList->length;
	}
	
	return ret; 
}

//元素插入链表;在链表slist的pos位置插入新元素node
//返回值为1表示插入成功,0表示插入失败
int LinkList_Insert(LinkList* list,LinkListNode* node,int pos)
{
	TLinkList* sList = (TLinkList*)list;	//强制类型转换
	//1.判断链表是否正确 
	//2.判断插入位置是否正确 
	int ret = (sList != NULL) && (0 <= pos) && (node!=NULL);
	int i = 0;
	if(ret)
	{		
		LinkListNode* current =  (LinkListNode*)sList;	//指向表头结点  
		
		for(i=0;(inext != NULL);i++)
		{
			current = current->next;
		}
		
		node->next = current->next;
		current->next = node;
		
		sList->length++;		
	} 
	
	return ret;
}

//获取链表中某个位置的元素;获取链表list的pos位置处的元素
//返回值为pos位置处的元素,NULL表示获取失败
LinkListNode* LinkList_Get(LinkList* list,int pos)
{
	TLinkList* sList = (TLinkList*)list;	//强制类型转换 
	LinkListNode* ret = NULL;
	int i = 0;
	//1.判断链表是否正确 
	//2.判断插入位置是否正确
	if((sList != NULL) && (0 <= pos) && (pos < sList->length))
	{	//定义current指向表头 
		LinkListNode* current = (LinkListNode*)sList;
		
		for(i=0;i
			current = current->next;
		}
		
		ret = current->next;
	}
	
	return ret;	
}

//将某个元素从链表中删除;删除链表sList的pos位置处的元素
//返回值为删除的元素,NULL表示获取失败
LinkListNode* LinkList_Delete(LinkList* list,int pos)
{
	TLinkList* sList = (TLinkList*)list;	//强制类型转换 
	LinkListNode* ret = NULL;
	int i = 0;
	//1.判断链表是否正确 
	//2.判断插入位置是否正确
	if((sList != NULL) && (0 <= pos) && (pos < sList->length))
	{	//定义current指向表头 
		LinkListNode* current = (LinkListNode*)sList;
		
		for(i=0;i
			current = current->next;
		}
		
		ret = current->next;
		current->next  = ret->next;
		
		sList->length--;
	}
	
	return ret;
}


输出:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/887497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号