先定义双向链表的结构体,这个链表具有通用性,可以实现“共享”链表的功能。
typedef int datatype;
typedef struct _dblink{
_dblink* pre;
_dblink* next;
}dblink,dbNode;
typedef struct _linkStack {
datatype data;
int size;
dblink dbNode;
}Stack,stackNode;
其他的代码如,栈的生成和入栈、出栈以及栈的销毁等API函数
#include<Windows.h>
#include<iostream>
using namespace std;
#define MAX_SIZE 100
#define stack_data(node,type,menber) ((type*)((char*)node-offsetof(type,menber)))
//int off = offsetof(stackNode,dbNode);
//((stackNode*)((char*)node - off))->data = value;
typedef int datatype;
typedef struct _dblink{
_dblink* pre;
_dblink* next;
}dblink,dbNode;
typedef struct _linkStack {
datatype data;
int size;
dblink dbNode;
}Stack,stackNode;
bool initLinkStack(Stack* &ls);
bool pushStack(Stack*& ls, datatype value);
bool popStack(Stack*& ls, datatype& value);
bool isEmpty(Stack*& ls);
bool isFull(Stack*& ls);
void destroy(Stack*& ls);
void printStack(Stack*& ls);
int main() {
Stack* ls;
if (initLinkStack(ls)) {
std::cout << "初始化成功!" << std::endl;
}
else {
std::cout << "初始化失败!" << std::endl;
}
// 入栈
datatype value;
for (int i = 10; i > 0; i--) {
value = i;
if (pushStack(ls, value)) {
std::cout << "入栈成功:" <<value<< std::endl;
}
else {
std::cout << "入栈失败:" << value << std::endl;
}
}
printStack(ls);
//出栈
while (ls->size) {
if (popStack(ls, value)) {
std::cout << "出栈成功:" << value << std::endl;
}
else {
std::cout << "出栈失败:" << std::endl;
}
}
printStack(ls);
destroy(ls);
system("pause");
return 0;
}
bool initLinkStack(Stack* &ls) {
ls = new Stack;
if (!ls) return false;
ls->size = 0;
ls->dbNode.next = ls->dbNode.pre = NULL;
ls->data = -1;
return true;
}
bool pushStack(Stack* &ls, datatype value) {
if (isFull(ls)) return false;
dblink* node = new dblink;
if (!node) return false;
ls->size++;
//int off = offsetof(stackNode,dbNode);
//((stackNode*)((char*)node - off))->data=value;
stack_data(node, stackNode, dbNode)->data=value;
node->pre = node->next = NULL;
dbNode* tmp = &(ls->dbNode);
while (tmp->next) {
tmp = tmp->next;
}
tmp->next = node;
node->pre = tmp;
return true;
}
bool popStack(Stack* &ls, datatype& value) {
if (isEmpty(ls)) return false;
dbNode* tmp = &(ls->dbNode);
while (tmp->next) {
tmp = tmp->next;
}
value = stack_data(tmp, stackNode, dbNode)->data;
tmp->pre->next = NULL;
tmp->pre = NULL;
delete tmp;
ls->size--;
return true;
}
bool isEmpty(Stack* &ls) {
if (!ls->size)
return true;
else
return false;
}
bool isFull(Stack* &ls) {
if (ls->size == MAX_SIZE)
return true;
else
return false;
}
void destroy(Stack* &ls) {
if (!ls) return;
dblink* tmp = (&(ls->dbNode))->next;
delete ls;
dblink* lkstack;
while (tmp) {
lkstack = tmp->next;
delete tmp;
tmp = lkstack;
}
}
void printStack(Stack* &ls){
if (!ls || !ls->size) return;
dbNode* tmp = &(ls->dbNode);
while (tmp) {
std::cout << stack_data(tmp, stackNode, dbNode)->data << " ";
tmp=tmp->next;
}
std::cout << endl;
}
运行的结果如下: