数据结构 线性链表栈
生活随笔
收集整理的這篇文章主要介紹了
数据结构 线性链表栈
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#ifndef _MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_typedef void LinkStack;//創建鏈表棧
LinkStack* LinkStack_Create();//銷毀鏈表棧
int LinkStack_Destroy(LinkStack** stack);//清空鏈表棧
int LinkStack_Clear(LinkStack* stack);//壓棧
int LinkStack_Push(LinkStack* stack, void* item);//出棧
void* LinkStack_Pop(LinkStack* stack);//獲取棧頂元素
void* LinkStack_Top(LinkStack* stack);//獲取棧的大小
int LinkStack_Size(LinkStack* stack);#endif //_MY_LINKSTACK_H_ //鏈式棧代碼實現
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"LinkList.h"//調用鏈表動態庫
#include"linkstack.h"/*
自己構造結構體的必要性
鏈表棧是調用線性鏈表動態庫實現的 線性鏈表必須要求結構體中有LinkNode類型的屬性
但是用戶未必會讓自己的結構體帶這個屬性,必須由棧實現方法里帶上
*/
typedef struct _TLinkStack{LinkNode node;void * item;
}TLinkStack;//創建鏈表棧
LinkStack* LinkStack_Create(){return (LinkStack*)LinkList_Create();
}//銷毀鏈表棧
int LinkStack_Destroy(LinkStack** stack){int ERRO_MSG = 0;/*刪除的時候,先清空鏈表,然后再刪除*/ERRO_MSG=LinkStack_Clear(*stack);//銷毀鏈表ERRO_MSG = LinkList_Destroy(stack);return ERRO_MSG;
}//清空鏈表棧
/*
因為TLinkStack是我們幫用戶創建的,不是用戶自己的結構體,所以用戶不可能會釋放,只能由我們來實現必須循環遍歷 一個個的刪除
*/
int LinkStack_Clear(LinkStack* stack){int ERRO_MSG = 0;while (LinkList_Length(stack)){//一個個刪除元素 從第一個開始刪除 減少遍歷次數TLinkStack * temp = (TLinkStack *)LinkList_Delete(stack, 0);if (temp!=NULL){free(temp);temp = NULL;}}//將元素個數置零ERRO_MSG = LinkList_Clear(stack);return ERRO_MSG;
}//壓棧
/*
對于鏈表而言,從尾部插入,需要遍歷前面的所有節點,還是從頭結點插入比較效率
*/
int LinkStack_Push(LinkStack* stack, void* item){int ERRO_MSG = 0;//臨時變量必須mallocTLinkStack * tstack = (TLinkStack *)malloc(sizeof(TLinkStack));if (tstack==NULL){ERRO_MSG = -1;printf("分配內存失敗!erro msg:%d \n", ERRO_MSG);return ERRO_MSG;}//初始化內存memset(tstack, 0, sizeof(TLinkStack));//將用戶數據賦值到內存中tstack->item = item;//用頭插法插入元素ERRO_MSG=LinkList_Insert(stack, (LinkNode *)tstack, 0);return ERRO_MSG;
}//出棧
void* LinkStack_Pop(LinkStack* stack){//刪除棧頂元素TLinkStack *tstack = (TLinkStack *)LinkList_Delete(stack, 0);//定義返回變量void * ret = NULL;if (tstack!=NULL){ret = tstack->item;free(tstack);tstack = NULL;}return ret;
}//獲取棧頂元素
void* LinkStack_Top(LinkStack* stack){//定義返回變量void * ret = NULL;//獲取第0個節點元素TLinkStack *tstack = (TLinkStack *)LinkList_Get(stack, 0);if (tstack!=NULL){ret = tstack->item;}return ret;
}//獲取棧的大小
int LinkStack_Size(LinkStack* stack){return LinkList_Length(stack);
} //鏈表棧的測試代碼
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"linkstack.h"typedef struct _Student{char name[30];int age;
}Student;void Test(){Student s1, s2, s3, s4, s5;int numx = 0, i = 0, ret = 0;strcpy(s1.name, "小米");s1.age = 11;strcpy(s2.name, "小剛");s2.age = 12;strcpy(s3.name, "小紅");s3.age = 10;strcpy(s4.name, "嘯天");s4.age = 13;strcpy(s5.name, "蓮華");s5.age = 12;LinkStack *stack = NULL;//創建棧stack = LinkStack_Create();//壓棧ret = LinkStack_Push(stack, &s1);if (ret != 0){printf("入棧失敗!\n");return;}ret = LinkStack_Push(stack, &s2);if (ret != 0){printf("入棧失敗!\n");return;}ret = LinkStack_Push(stack, &s3);if (ret != 0){printf("入棧失敗!\n");return;}ret = LinkStack_Push(stack, &s4);if (ret != 0){printf("入棧失敗!\n");return;}ret = LinkStack_Push(stack, &s5);if (ret != 0){printf("入棧失敗!\n");return;}numx = LinkStack_Size(stack);//出棧for (i = 0; i < numx; i++){Student *temp = (Student *)LinkStack_Pop(stack);printf("我的名字是%s;我的年齡是%d\n", temp->name, temp->age);}//清空棧ret = LinkStack_Clear(stack);if (ret != 0){printf("銷毀鏈表失敗!\n");return;}//銷毀棧LinkStack_Destroy(&stack);
}void main(){Test();system("pause");
}
?
轉載于:https://www.cnblogs.com/zhanggaofeng/p/5697502.html
總結
以上是生活随笔為你收集整理的数据结构 线性链表栈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python之工作举例:通过复制NC文件
- 下一篇: 【C/C++开发】C++11 并发指南二