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;
}
浙公网安备 33010602011771号