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