加强版单链表

Posted on 2016-06-01 11:40  洪爵士  阅读(105)  评论(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"LinkList.h"
#include<stdlib.h>
#include<stdio.h>
//链表初始化:创建链表
LinkList* Creat_LinkList()
{
	LinkList *list=NULL;
	LinkNode* header=NULL;
	list=(LinkList*)malloc(sizeof(LinkList));
	if(list==NULL)
	{
		return NULL;
	}
	header=(LinkNode*)malloc(sizeof(LinkNode));
	if(header==NULL)
	{
		free(list);
		list=NULL;
		return NULL;
	}
	header->next=NULL;
	header->data=0;//该数据没意义
	list->head=header;
	list->length=0;
	return list;
}
//插入数据
void Insert_LinkList(LinkList* list,int pos,void* data)
{
	LinkNode *pCurrent=NULL;//辅助指针
	LinkNode *newnode=NULL;//插入的新节点
	int i=0;
	if(list==NULL)
	{
		return ;
	}
	if(pos<0)
	{
		return ;
	}
	if(pos>list->length)
	{
		pos=list->length;
	}
	pCurrent=list->head;
	for(i=0;i<pos;i++)
	{
		pCurrent=pCurrent->next;
	}
	//创建新的节点
	newnode=(LinkNode*)malloc(sizeof(LinkNode));
	newnode->data=data;
	newnode->next=NULL;
	//新节点插入链表中
	newnode->next=pCurrent->next;
	pCurrent->next=newnode;
	//更新链表的长度
	list->length++;
}
//根据位置删除
void Remove_LinkList(LinkList* list,int pos)
{
	int i=0;
	LinkNode *pCurrent=NULL;//辅助指针
	LinkNode* pDel=NULL;//缓存要删除的节点
	if(list==NULL)
	{
		return ;
	}
	if(pos<0||pos>list->length-1)
	{
		return ;
	}
	//查找要删除节点的位置
	pCurrent=list->head;
	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,void* data)
{
	LinkNode* pPrev=NULL;//两个辅助指针变量
	LinkNode* pCurrent=NULL;
	int flag=0;
	if(list==NULL||data==NULL)
	{
		return;
	}
	//辅助指针变量
	pPrev=list->head;
	pCurrent=pPrev->next;
	//查找节点:两个辅助指针同时移动
	while(list->length>0)
	{
		if(pCurrent->data==data)//找到了
		{
			pPrev->next=pCurrent->next;
			list->length--;
			free(pCurrent);
			break;
		}
		pPrev=pCurrent;
		pCurrent=pPrev->next;
		if(pCurrent==NULL)//没找到
		{
			break ;
		}
	}
	return ;
}
//获得链表长度
int Length_LinkList(LinkList* list)
{
	if(list==NULL)
	{
		return -1;
	}
	return list->length;
}
//获得指定位置的数据
void* GetData_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->head;
	for(i=0;i<pos;i++)
	{
		pCurrent=pCurrent->next;
	}
	return pCurrent->next->data;
}
//获取指定数据的位置
int GetPos_LinkList(LinkList* list,void* data)
{
	int pos=0;
	LinkNode *pCurrent=NULL;//辅助指针
	if(list==NULL||data==NULL)
	{
		return -1;
	}
	pCurrent=list->head->next;
	while(list->length>0)
	{
		if(pCurrent->data==data)//找到了
		{
			return pos;
		}
		pCurrent=pCurrent->next;
		if(pCurrent==NULL)//没找到
		{
			return -1;
		}
		pos++;
	}
	return -1;
}
//根据位置修改值
void Modify_LinkList(LinkList* list,int pos,void* data)
{
	int i=0;
	LinkNode* pCurrent=NULL;//赋值指针
	LinkNode* pPrev=NULL;
	LinkNode* newnode=NULL;
	if(list==NULL||data==NULL)
	{
		return ;
	}
	if(pos<0||pos>list->length-1)
	{
		return ;
	}
	//查找要修改的节点:两个辅助指针同时移动
	pPrev=list->head;
	pCurrent=pPrev->next;
	for(i=0;i<pos;i++)
	{
		pPrev=pCurrent;
		pCurrent=pCurrent->next;
	}
	//创建新的节点
	newnode=(LinkNode*)malloc(sizeof(LinkNode));
	newnode->data=data;
	newnode->next=NULL;
	//新节点插入链表中
	newnode->next=pCurrent->next;
	pPrev->next=newnode;
	//释放旧的节点
	free(pCurrent);
	return ;
}
//根据值修改值
void Change_LinkList(LinkList* list,void* olddata,void* newdata)
{
	LinkNode* pPrev=NULL;
	LinkNode* pCurrent=NULL;
	LinkNode* newnode=NULL;
	if(list==NULL || olddata==NULL || newdata==NULL)
	{
		return;
	}
	//辅助指针
	pPrev=list->head;
	pCurrent=pPrev->next;
	while(list->length>0)
	{
		if(pCurrent->data==olddata)//找到了
		{
			newnode=(LinkNode*)malloc(sizeof(LinkNode));
			newnode->data=newdata;
			newnode->next=NULL;
			//修改newnode的next指针指向
			newnode->next=pCurrent->next;
			pPrev->next=newnode;
			free(pCurrent);
			break;
		}
		pPrev=pCurrent;
		pCurrent=pPrev->next;
		if(pCurrent==NULL)//没有找到
		{
			break;
		}
	}
}
//清空链表
void Clear_LinkList(LinkList* list)
{
	LinkNode *pCurrent=NULL;//辅助指针
	if(list==NULL)
	{
		return ;
	}
	pCurrent=list->head->next;
	while(pCurrent!= NULL)
	{
		//缓存下一个结点位置
		LinkNode* pNext=pCurrent->next;
		free(pCurrent);
		pCurrent=pNext;
	}
	//改变头结点指向
	list->head->next=NULL;
	list->length = 0;
}
//销毁链表
void Destroy_LinkList(LinkList* list)
{
	if(list==NULL)
	{
		return;
	}
	Clear_LinkList(list);//清空链表
	if (list->head!=NULL)
	{
		free(list->head);
	}
	//释放链表内存
	free(list);
}
//打印函数
void Print_LinkList(LinkList* list, PRINTLINKNODE print)
{
	LinkNode* pCurrent=NULL;
	if(list==NULL)
	{
		return;
	}
	if(print==NULL)
	{
		return;
	}
	pCurrent=list->head->next;
	while(pCurrent!=NULL)
	{
		print(pCurrent->data);
		pCurrent=pCurrent->next;
	}
	printf("\n");
}

  test.c文件 为了测试这个单链表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"LinkList.h"
//自定义数据
typedef struct _Player
{
	char name[128];
	int age;
	double salary;
}Player;

//打印回调
void PrintPlayer(void* data)
{
	Player* p=NULL;
	if(data==NULL)
	{
		return ;
	}
	p=(Player*)data;
	printf("Name:%s Age:%d Salary:%f\n",p->name,p->age,p->salary);
}
int main()
{

	//初始化创建一个链表
	int pos=0;
	Player *p=NULL;
	LinkList *list=Creat_LinkList();
	//创建数据
	Player p1={"aaa",10,1};
	Player p2={"bbb",20,2};
	Player p3={"ccc",30,3};
	Player p4={"ddd",40,4};
	Player p0={"000",00,0};
	//插入数据
	Insert_LinkList(list,0,&p1);
	Insert_LinkList(list,0,&p2);
	Insert_LinkList(list,0,&p3);
	Insert_LinkList(list,0,&p4);
	//打印
	Print_LinkList(list,PrintPlayer);
	//测试删除
	//Remove_LinkList(list,3);
	//Delete_LinkList(list,&p2);
	//Modify_LinkList(list,3,&p0);
	Change_LinkList(list,&p3,&p0);
	Print_LinkList(list,PrintPlayer);//打印
	//pos=GetPos_LinkList(list,&p);
	printf("pos=%d\n",pos);
	//销毁
	Destroy_LinkList(list);
	return 0;

}