数据结构--单链表的实现

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct value
{
	LinkListNode* next;
	int v;	
};
//数据域元素结构体的定义,与头结点对比,基本上一样 
int main(int argc, char *argv[]) 
{
	int i=0;
	LinkList* list=LinkList_Create();
	struct value v1;
	struct value v2;
	struct value v3;
	struct value v4;
	struct value v5;
	v1.v=1;
	v2.v=2;
	v3.v=3;
	v4.v=4;
	v5.v=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<LinkList_Length(list);i++)
	{
		struct value*pv=(struct value*)LinkList_Get(list,i);
		printf("%d\n",pv->v);
	}
	printf("\n");
	while(LinkList_Length(list)>0)
	{
		struct value* pv=(struct value*)LinkList_Delete(list,0);
		printf("%d\n",pv->v);
	}
	printf("\nafter Delete!\n");
		for(i=0;i<LinkList_Length(list);i++)
	{
		struct value*pv=(struct value*)LinkList_Get(list,i);
		printf("%d\n",pv->v);
	}
	LinkList_Destroy(list);
	 
	return 0;
}

#include <stdio.h>
#include "LinkList.h"
#include <malloc.h>
typedef struct _tag_LinkList
{
	LinkListNode header;
	int length;
}TLinkList;
//头结点的定义,里面包括一个指向单链表的头指针,和表示单链表信息的数据
/****************************
/功能:创建一个单链表,实际上是将头结点创建出来,给头结点分配内存空间,这个空间里面有
/一个头结点指针,它通过后面的Insert函数,将这个指针指向main中已经分配好内存的数据节点结构体的地址 
/struct value v
/每次插入都会将相应的数据域节点结构的 地址关联起来,所以实际上创建出头结点即可,
/头结点关联起各个数据域节点之间的关系 
/返回值:TLinkList* 头结点的地址 
/***************************/ 
LinkList* LinkList_Create()
{
	TLinkList*ret=(TLinkList*)malloc(sizeof(TLinkList));
	if(ret!=NULL)
	{
		ret->header.next=NULL;
		ret->length=0;
	}
	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)
{
	int ret=-1;
	TLinkList* sList=(TLinkList*)list;
	if(sList!=NULL)
	{
		ret=sList->length;
	}
	return ret;
}
/*********************************************
/功能:在单链表下标pos的位置插入一个数据元素节点node
/参数:要插入链表的地址list,要插入节点的地址node,位置pos 
/返回值,int 
/
***********************************************/ 
int LinkList_Insert(LinkList* list,LinkListNode* node,int pos)
{
	int flag;
	//强制类型转换,将void* 地址转换成 头结点型 
	TLinkList* sList=(TLinkList*)list;
	flag=((sList!=NULL)&&(node!=NULL)&&(0<=pos));
	if(flag)
	{
		//获取当前节点,需强制类型转换 
		LinkListNode* current=(LinkListNode*)sList;
		int i=0;
		//找到pos-1的位置 
		for(i=0;(i<pos)&&current->next!=NULL;i++)
		{
			current=current->next;
		}
		node->next=current->next;
		current->next=node;
		sList->length++;
	}
	return flag;
}
/*********************************************
/功能:在单链表下标pos的位置删除一个数据元素节点node
/参数:要插入链表的地址list,要插入节点的地址node,位置pos 
/返回值:返回删除的节点的地址,LinkListNode* 
/
***********************************************/ 
LinkListNode* LinkList_Delete(LinkList* list,int pos)
{
	TLinkList* sList=(TLinkList*)list;
	LinkListNode* ret=NULL;
	if((sList!=NULL)&&(pos>=0)&&(pos<sList->length))
	{
		LinkListNode* current=(LinkListNode*)sList;
		int i=0;
		for(i=0;i<pos;i++)
		{
			current=current->next;
		}
		ret=current->next;
		current->next=ret->next;
		sList->length--;
	}
	return ret;
	
}
LinkListNode* LinkList_Get(LinkList* list,int pos)
{
	TLinkList* sList=(TLinkList*)list;
	LinkListNode* ret=NULL;
	if((sList!=NULL)&&(pos>=0)&&(pos<sList->length))
	{
		LinkListNode* current=(LinkListNode*)sList;
		int i=0;
		for(i=0;i<pos;i++)
		{
			current=current->next;
		}
		ret=current->next;
	}
	return ret;
}


#ifndef _LINKLIST_H
#define _LINKLIST_H
typedef void LinkList;
typedef struct _tag_LinkListNode LinkListNode;
struct _tag_LinkListNode
{
	LinkListNode* next;
};


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_Delete(LinkList* list,int pos);
LinkListNode* LinkList_Get(LinkList* list,int pos);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值