链式链表的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