链式链表的C风格实现
生活随笔
收集整理的这篇文章主要介绍了
链式链表的C风格实现
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
头文件:
#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);#endifCPP文件:
#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指向NULLret->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; }
转载于:https://www.cnblogs.com/Lxk0825/p/9519919.html
总结
以上是生活随笔为你收集整理的链式链表的C风格实现的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: textbox 和textera 文本
- 下一篇: 【算法】QuickSort