企业版单链表

Posted on 2016-06-01 11:45  洪爵士  阅读(229)  评论(0编辑  收藏  举报

LinkList.h文件

#ifndef LINKLIST_H
#define LINKLIST_H
//有头单链表
//链表结点
typedef struct _LinkNode
{
	struct _LinkNode* next;
}LinkNode;

//链表结构体
typedef struct _LinkList
{
	LinkNode header;
	int length;
}LinkList;

//回调打印
typedef void(*PRINTNODE)(LinkNode*);

//初始化链表
LinkList* Creat_LinkList();
//插入操作
void Insert_LinkList(LinkList* list,int pos,LinkNode* data);
//根据位置删除
void Remove_LinkList(LinkList* list,int pos);
//根据数据删除
void Delete_LinkList(LinkList* list,LinkNode* data);
//根据值返回位置
int GetPos_LinkList(LinkList* list,LinkNode* data);
//根据位置返回节点值
LinkNode* GetNode_LinkList(LinkList* list,int pos);
//根据位置修改值
void Modify_LinkList(LinkList* list,int pos,LinkNode* newdata);
//根据值修改值
void Change_LinkList(LinkList* list,LinkNode* olddata,LinkNode* newdata);
//清空链表
void Clear_LinkList(LinkList* list);
//销毁链表
void Destroy_LinkList(LinkList* list);
//打印链表
void Print_LinkList(LinkList* list,PRINTNODE print);

#endif

  LinkList.c文件

#include<stdlib.h>
#include<stdio.h>
#include"LinkList.h"

//初始化链表:创建单链表
LinkList* Creat_LinkList()
{

	//给链表的结构体分配内存
	LinkList* list=(LinkList*)malloc(sizeof(LinkList));
	if (list==NULL)
	{
		return NULL;
	}
	list->header.next = NULL;
	list->length = 0;
	return list;
}
//插入操作
void Insert_LinkList(LinkList* list,int pos,LinkNode* data)
{
	int i=0;
	LinkNode* pCurrent=NULL;//辅助指针
	if(list==NULL)
	{
		return;
	}
	if (pos < 0)
	{
		return;
	}
	if(pos>list->length)
	{
		pos=list->length;
	}
	if(data==NULL)
	{
		return;
	}

	//找位置
	pCurrent=&(list->header);
	for(i=0;i<pos;i++)
	{
		pCurrent=pCurrent->next;
	}

	//结点入链表
	data->next=pCurrent->next;
	pCurrent->next=data;
	list->length++;
}
//根据位置删除
void Remove_LinkList(LinkList* list,int pos)
{
	LinkNode* pCurrent=NULL;
	LinkNode* pDel=NULL;//缓存要删除的节点
	int i=0;
	if(list==NULL)
	{
		return;
	}
	if(pos<0||pos>list->length-1)
	{
		return;
	}
	pCurrent=&(list->header);;
	for(i=0;i<pos;i++)
	{
		pCurrent=pCurrent->next;
	}
	//缓存待删除结点
	pDel=pCurrent->next;
	pCurrent->next=pDel->next;
	//不需要free(pDel) 
	list->length--;
}
//根据数据删除
void Delete_LinkList(LinkList* list,LinkNode* data)
{
	LinkNode* pCurrent=NULL;//辅助指针
	LinkNode* pPrev=NULL;
	if(list==NULL||data==NULL)
	{
		return ;
	}
	//查找要删除的节点:两个辅助指针同时移动
	pPrev=&(list->header);
	pCurrent=pPrev->next;
	while(list->length>0)
	{
		if(pCurrent==data)//找到了
		{
			pPrev->next=pCurrent->next;
			list->length--;
			break;
		}
		pPrev=pCurrent;
		pCurrent=pCurrent->next;
		if(pCurrent==NULL)//没找到
		{
			break;
		}
	}
}
//根据值返回位置
int GetPos_LinkList(LinkList* list,LinkNode* data)
{
	LinkNode* pCurrent=NULL;//辅助指针
	int pos=0;
	if(list==NULL||data==NULL)
	{
		return -1;
	}
	pCurrent=list->header.next;
	while(list->length>0)
	{
		if(pCurrent==data)//找到了
		{
			return pos;
		}
		pCurrent=pCurrent->next;
		if(pCurrent==NULL)//没找到
		{
			return -1;
		}
		pos++;
	}
	return -1;
}
//根据位置返回节点
LinkNode* GetNode_LinkList(LinkList* list,int pos)
{
	int i=0;
	LinkNode* pCurrent=NULL;//辅助指针
	if(list==NULL)
	{
		return NULL;
	}
	if(pos<0||pos>list->length-1)
	{
		return NULL;
	}
	pCurrent=&(list->header);
	for(i=0;i<pos;i++)
	{
		pCurrent=pCurrent->next;
	}
	return pCurrent->next;
}
//根据位置修改值
void Modify_LinkList(LinkList* list,int pos,LinkNode* newdata)
{
	int i=0;
	LinkNode* pCurrent=NULL;//两个辅助指针
	LinkNode* pPrev=NULL;
	if(list==NULL||newdata==NULL)
	{
		return ;
	}
	if(pos<0||pos>list->length-1)
	{
		return ;
	}
	//找到要修改的值:两个辅助指针同时移动
	pPrev=&(list->header);
	pCurrent=pPrev->next;
	for(i=0;i<pos;i++)
	{
		pPrev=pCurrent;
		pCurrent=pCurrent->next;
	}
	newdata->next=pCurrent->next;
	pPrev->next=newdata;
	return ;
}
//根据值修改
void Change_LinkList(LinkList* list,LinkNode* olddata,LinkNode* newdata)
{
	LinkNode* pCurrent=NULL;//辅助指针
	LinkNode* pPrev=NULL;
	if(list==NULL||olddata==NULL||newdata==NULL)
	{
		return ;
	}
	//查找要求修改的值:两个辅助指针移动
	pPrev=&(list->header);
	pCurrent=pPrev->next;
	while(list->length>0)
	{
		if(pCurrent==olddata)//找到了
		{
			newdata->next=pCurrent->next;
			pPrev->next=newdata;
			break;
		}
		pPrev=pCurrent;
		pCurrent=pCurrent->next;
		if(pCurrent==NULL)//没找到
		{
			break;
		}
	}
}
//清空链表
void Clear_LinkList(LinkList* list)
{
	if(list==NULL)
	{
		return;
	}
	list->header.next=NULL;
	list->length=0;
}
//销毁链表
void Destroy_LinkList(LinkList* list)
{
	if(list==NULL)
	{
		return;
	}
	list->header.next=NULL;
	list->length=0;
	free(list);
}
//打印链表
void Print_LinkList(LinkList* list,PRINTNODE print)
{
	LinkNode* pCurrent=NULL;
	if(list==NULL)
	{
		return;
	}

	//辅助指针变量
	pCurrent=list->header.next;
	while(pCurrent!=NULL)
	{
		print(pCurrent);
		pCurrent=pCurrent->next;
	}
	printf("\n");
}

  test.c文件,测试单链表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"LinkList.h"

//自定义数据
typedef struct _Player
{
	LinkNode node;//包含该节点
	int age;
	int number;
}Player;

//打印回调
void PrintPlayer(LinkNode* node)
{
	Player* p=NULL;
	if(node==NULL)
	{
		return ;
	}
	p=(Player*)node;
	printf("Age:%d Number:%d\n",p->age,p->number);
}

int main()
{

	//创建链表
	int pos=0;
	LinkList* list=Creat_LinkList();
	//创建数据
	Player p1,p2,p3,p0;
	Player *p=NULL;
	p0.age=0;
	p0.number=0;
	p1.age=10;
	p1.number=1;

	p2.age=20;
	p2.number=2;

	p3.age=30;
	p3.number=3;

	//插入数据
	Insert_LinkList(list,0,(LinkNode*)&p1);
	Insert_LinkList(list,0,(LinkNode*)&p2);
	Insert_LinkList(list,0,(LinkNode*)&p3);
	//打印
	Print_LinkList(list,PrintPlayer);
	//测试删除和修改
	//Remove_LinkList(list,2);
	Delete_LinkList(list,(LinkNode*)&p2);
	//Modify_LinkList(list,3,(LinkNode*)&p0);
	//Change_LinkList(list,(LinkNode*)&p1,(LinkNode*)&p0);
	//打印
	Print_LinkList(list,PrintPlayer);
	pos=GetPos_LinkList(list,(LinkNode*)&p);
	printf("pos=%d\n",pos);
	p=(Player*)GetNode_LinkList(list,2);
	PrintPlayer((LinkNode*)p);
	//销毁链表
	Destroy_LinkList(list);
	return 0;
}