链式链表的C风格实现
生活随笔
收集整理的這篇文章主要介紹了
链式链表的C风格实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
頭文件:
#ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //將數(shù)據(jù)的類型分離,相當(dāng)于句柄//只是一個(gè)小節(jié)點(diǎn) 包含著位置信息! typedef struct _tag_LinkListNode {struct _tag_LinkListNode* next; }LinkListNode;//生成一個(gè)鏈表 LinkList* LinkList_Create(); //刪除一個(gè)鏈表 void LinkList_Destory(LinkList* list); //清空一個(gè)鏈表 void LinkList_Clear(LinkList* list); //鏈表長(zhǎng)度 int LinkList_Length(LinkList* list); //在某個(gè)位置插入一個(gè)節(jié)點(diǎn) int LinkList_Insert(LinkList* list, LinkListNode* node, int pos); //獲取某個(gè)位置的節(jié)點(diǎn) LinkListNode* LinkList_Get(LinkList* list, int pos); //刪除某個(gè)位置的節(jié)點(diǎn) LinkListNode* LinkList_Delete(LinkList* list, int pos);#endifCPP文件:
#include "linkList.h" #include <iostream> using namespace std;//定義一個(gè)鏈表頭 typedef struct _tag_LinkList {LinkListNode header; //定義一個(gè)頭結(jié)點(diǎn)int length;}tagList;//生成一個(gè)鏈表 LinkList* LinkList_Create() {tagList * ret = NULL;ret = (tagList *)malloc(sizeof(tagList)); //分配內(nèi)存memset(ret, 0, sizeof(tagList)); //memset快速填充 ret->header.next = NULL; //頭結(jié)點(diǎn)的Next指向NULLret->length = 0;return ret; } //刪除一個(gè)鏈表 void LinkList_Destory(LinkList* list) {//異常處理if (list != NULL){free(list);list = NULL;}return; } //清空一個(gè)鏈表 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; } //鏈表長(zhǎng)度 int LinkList_Length(LinkList* list) {tagList *tList = NULL;if(list == NULL){cout << "LinkList_Length Err" << endl;return -1;}tList = (tagList *)list;return tList->length; } //在某個(gè)位置插入一個(gè)節(jié)點(diǎn)//鏈表是單向的 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首先指向頭結(jié)點(diǎn)for(int i = 0; ((i < pos) && (current->next !=NULL)); i++){current = current->next; //指向POS節(jié)點(diǎn)的前一個(gè)位置 }//node的NEXT改變 將Current的NEXT域的信息存入node的NEXT域node->next = current->next;//Current的NEXT域指向node 從而實(shí)現(xiàn)插入current->next = node;tList->length++;return 0; } //獲取某個(gè)位置的節(jié)點(diǎn) LinkListNode* LinkList_Get(LinkList* list, int pos) {int ret = 0;LinkListNode* current = NULL; //輔助節(jié)點(diǎn)指針變量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首先指向頭結(jié)點(diǎn)for(int i = 0; ((i < pos) && (current->next !=NULL)); i++){current = current->next;}temp = current->next;//返回Current的Next域?yàn)镻OS位置信息return temp; }//刪除某個(gè)位置的節(jié)點(diǎn) 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節(jié)點(diǎn)的前一個(gè)位置 }//temp指針指向POS位置的節(jié)點(diǎn)temp = current->next;//將temp 也就是POS位置的NEXT域值賦給CurrentNext域 從而實(shí)現(xiàn)跳過(guò)刪除current->next =temp->next;tList->length--;return temp; }測(cè)試函數(shù):
#include <iostream> #include "linkList.h" using namespace std;typedef struct _Teacher {LinkListNode node; //必須在所需要的數(shù)據(jù)結(jié)構(gòu)中添加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;//創(chuàng)建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; }?
轉(zhuǎn)載于:https://www.cnblogs.com/Lxk0825/p/9519919.html
總結(jié)
以上是生活随笔為你收集整理的链式链表的C风格实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: textbox 和textera 文本
- 下一篇: 【算法】QuickSort