C++实现单向链表
发布时间:2020-12-16 10:47:17 所属栏目:百科 来源:网络整理
导读:LinkList.h ? #include windows.h #include stdio.h // 链表结点 typedef struct LINKNODE{ void * data; // 可以指向任何类型的数据 LINKNODE* next;}LinkNode; // 链表结构体 typedef struct LINKLIST{ int size; LinkNode * head;}LinkList; // 打印函数
LinkList.h ? #include <windows.h> #include <stdio.h> // 链表结点 typedef struct LINKNODE { void* data; // 可以指向任何类型的数据 LINKNODE* next; }LinkNode; // 链表结构体 typedef struct LINKLIST { int size; LinkNode* head; }LinkList; // 打印函数指针 typedef void(*PRINTLINKNODE)(void*); // 初始化链表 LinkList* Init_LinkList(); // 指定位置插入 void Insert_LinkList(LinkList* list,int pos,void* data); // 指定位置删除 void RemoveByPos_LinkList(LinkList* list,int pos); // 获得链表的长度 int GetLinkListSize(LinkList* list); // 查找(根据数据返回索引) int Find_LinkList(LinkList* list,void* data); // 返回第一个结点 void* Front_LinkList(LinkList* list); // 释放链表内存 void FreeMem_LinkList(LinkList* list); // 打印链表 void Print_LinkList(LinkList* list,PRINTLINKNODE); ? LinkList.cpp ? #include "LinkList.h" // 初始化链表 LinkList* Init_LinkList() { LinkList* list = (LinkList*)malloc(sizeof(LinkList)); list->size = 0; // 头结点是不保存数据的 list->head = (LinkNode*)malloc(sizeof(LinkNode)); list->head->data = NULL; list->head->next = NULL; return list; } // 指定位置插入 void Insert_LinkList(LinkList* list,void* data) { if (list == NULL || data == NULL) { return; } if (pos < 0 || pos > list->size) { pos = list->size; } // 创建新的结点 LinkNode* InsertNode = (LinkNode*)malloc(sizeof(LinkNode)); InsertNode->data = data; InsertNode->next = NULL; // 找结点 LinkNode* pCurrent = list->head; for (int i = 0; i < pos; i++) { pCurrent = pCurrent->next; } // 将新结点插入链表 InsertNode->next = pCurrent->next; pCurrent->next = InsertNode; // 链表大小加1 list->size++; } // 指定位置删除 void RemoveByPos_LinkList(LinkList* list,int pos) { if (list == NULL) { return; } if (pos < 0 || pos >= list->size) { return; } LinkNode* pCurrent = list->head; for (int i = 0; i < pos; i++) { pCurrent = pCurrent->next; } LinkNode* pDel = pCurrent->next; pCurrent->next = pCurrent->next->next; free(pDel); // 链表长度减一 list->size--; } // 获得链表的长度 int GetLinkListSize(LinkList* list) { if (list == NULL) { return - 1; } return list->size; } // 查找(根据数据返回索引) int Find_LinkList(LinkList* list,void* data) { if (list == NULL || data == NULL) { return -1; } int pos = -1; LinkNode* pCurrent = list->head->next; for (int i = 0; i < list->size; i++) { if (pCurrent->data == data) { pos = i; break; } pCurrent = pCurrent->next; } return pos; } // 返回第一个结点 void* Front_LinkList(LinkList* list) { return list->head->next->data; } // 释放链表内存 void FreeMem_LinkList(LinkList* list) { if (list == NULL) { return; } LinkNode* pCurrent = list->head; while (pCurrent != NULL) { LinkNode* pDel = pCurrent; pCurrent = pCurrent->next; free(pDel); } list->size = 0; free(list); } // 打印链表 void Print_LinkList(LinkList* list,PRINTLINKNODE print) { if (list == NULL) { return; } LinkNode* pCurrent = list->head->next; while (pCurrent != NULL) { print(pCurrent->data); pCurrent = pCurrent->next; } } ? main.cpp ? #include "LinkList.h" //自定义数据类型 typedef struct PERSON { char name[64]; int age; int score; }Person; //打印函数 void MyPrint(void* data) { Person* p = (Person*)data; printf("Name:%s Age:%d Score:%dn",p->name,p->age,p->score); } int main() { //创建链表 LinkList* list = Init_LinkList(); //创建数据 Person p1 = { "aaa",18,100 }; Person p2 = { "bbb",19,99 }; Person p3 = { "ccc",20,101 }; Person p4 = { "ddd",17,97 }; Person p5 = { "eee",16,59 }; //数据插入链表 Insert_LinkList(list,0,&p1); Insert_LinkList(list,0,&p2); Insert_LinkList(list,&p3); Insert_LinkList(list,&p4); Insert_LinkList(list,&p5); //打印 Print_LinkList(list,MyPrint); //删除3 RemoveByPos_LinkList(list,3); //打印 printf("---------------n"); Print_LinkList(list,MyPrint); //返回第一个结点 printf("-----查找结果------------n"); Person* ret = (Person*)Front_LinkList(list); printf("Name:%s Age:%d Score:%dn",ret->name,ret->age,ret->score); //销毁链表 Front_LinkList(list); getchar(); return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |