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(" "); }
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 ",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 ",pos); //销毁 Destroy_LinkList(list); return 0; }