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; }