标签:null 分配 header 清空 ret 添加 == get link
头文件:
#ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; //将数据的类型分离,相当于句柄 //只是一个小节点 包含着位置信息! typedef struct _tag_LinkListNode { struct _tag_LinkListNode* next; }LinkListNode; //生成一个链表 LinkList* LinkList_Create(); //删除一个链表 void LinkList_Destory(LinkList* list); //清空一个链表 void LinkList_Clear(LinkList* list); //链表长度 int LinkList_Length(LinkList* list); //在某个位置插入一个节点 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos); //获取某个位置的节点 LinkListNode* LinkList_Get(LinkList* list, int pos); //删除某个位置的节点 LinkListNode* LinkList_Delete(LinkList* list, int pos); #endif
CPP文件:
#include "linkList.h" #include <iostream> using namespace std; //定义一个链表头 typedef struct _tag_LinkList { LinkListNode header; //定义一个头结点 int length; }tagList; //生成一个链表 LinkList* LinkList_Create() { tagList * ret = NULL; ret = (tagList *)malloc(sizeof(tagList)); //分配内存 memset(ret, 0, sizeof(tagList)); //memset快速填充 ret->header.next = NULL; //头结点的Next指向NULL ret->length = 0; return ret; } //删除一个链表 void LinkList_Destory(LinkList* list) { //异常处理 if (list != NULL) { free(list); list = NULL; } return; } //清空一个链表 void LinkList_Clear(LinkList* list) { tagList *tList = NULL; if(list == NULL) { cout << "LinkList_Clear Err" << endl; return; } tList = (tagList *)list; tList->length = 0; tList->header.next = NULL; return; } //链表长度 int LinkList_Length(LinkList* list) { tagList *tList = NULL; if(list == NULL) { cout << "LinkList_Length Err" << endl; return -1; } tList = (tagList *)list; return tList->length; } //在某个位置插入一个节点 //链表是单向的 POS位置保存在POS-1的NEXT域里面 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) { int ret = 0; LinkListNode* current = NULL; //定义辅助指针变量Current tagList* tList; if (list == NULL || node == NULL || pos <0) { ret = -1; cout << "Insert Err" << endl; return ret; } tList = (tagList*)list; current = &(tList->header); //Current首先指向头结点 for(int i = 0; ((i < pos) && (current->next !=NULL)); i++) { current = current->next; //指向POS节点的前一个位置 } //node的NEXT改变 将Current的NEXT域的信息存入node的NEXT域 node->next = current->next; //Current的NEXT域指向node 从而实现插入 current->next = node; tList->length++; return 0; } //获取某个位置的节点 LinkListNode* LinkList_Get(LinkList* list, int pos) { int ret = 0; LinkListNode* current = NULL; //辅助节点指针变量 LinkListNode* temp = NULL; tagList* tList; if (list == NULL || pos <0) { ret = -1; cout << "Get Err" << endl; return NULL; } tList = (tagList*)list; current = &(tList->header); //Current首先指向头结点 for(int i = 0; ((i < pos) && (current->next !=NULL)); i++) { current = current->next; } temp = current->next; //返回Current的Next域为POS位置信息 return temp; } //删除某个位置的节点 LinkListNode* LinkList_Delete(LinkList* list, int pos) { int ret = 0; LinkListNode* current = NULL; LinkListNode* temp = NULL; //定义中间指针变量 tagList* tList; if (list == NULL || pos <0) { ret = -1; cout << "Get Err" << endl; return NULL; } tList = (tagList*)list; current = &(tList->header); for(int i = 0; ((i < pos) && (current->next !=NULL)); i++) { current = current->next; //Current指向POS节点的前一个位置 } //temp指针指向POS位置的节点 temp = current->next; //将temp 也就是POS位置的NEXT域值赋给CurrentNext域 从而实现跳过删除 current->next =temp->next; tList->length--; return temp; }
测试函数:
#include <iostream> #include "linkList.h" using namespace std; typedef struct _Teacher { LinkListNode node; //必须在所需要的数据结构中添加LinkListNode类型的node!! int age; char name[64]; }Teacher; int main() { int len = 0; int ret = 0; LinkList* list = NULL; Teacher t1, t2, t3, t4, t5; t1.age = 31; t2.age = 32; t3.age = 33; t4.age = 34; t5.age = 35; //创建 list = LinkList_Create(); if(list == NULL) { return -1; } len = LinkList_Length(list); //逐条插入 ret = LinkList_Insert(list, (LinkListNode*)(&t1), 0); ret = LinkList_Insert(list, (LinkListNode*)(&t2), 0); ret = LinkList_Insert(list, (LinkListNode*)(&t3), 0); ret = LinkList_Insert(list, (LinkListNode*)(&t4), 0); ret = LinkList_Insert(list, (LinkListNode*)(&t5), 0); for (int i = 0; i < LinkList_Length(list); i++) { cout << "List的遍历" << endl; cout << "age:" << ((Teacher*)LinkList_Get(list, i))->age << endl; } cout << endl; //头删 while(LinkList_Length(list) > 0) { cout << "删除的元素:" << ((Teacher*)LinkList_Delete(list, 0))->age << endl; } system("pause"); return 0; }
标签:null 分配 header 清空 ret 添加 == get link
原文地址:https://www.cnblogs.com/Lxk0825/p/9519919.html