.h文件(包含函数实现):
节点结构体:
typedef struct Dnode
{
int val;
struct Dnode* next;
struct Dnode* prev;
}Dnode;
由于后续对节点的访问都付诸指针,所以下一节点与上一节点也会初始化为指针
列表结构体:
typedef struct Dlink
{
Dnode* head, * tail;
size_t size;
}Dlink;
注:此处的size用于追踪栈长度,也可避免后续的访问冲突
节点及列表创建函数:
Dnode* Newnode(int data)
{
Dnode* p = (Dnode*)malloc(sizeof(Dnode));
assert(p != NULL);
p->prev = NULL;
p->val = data;
return p;
}
void Init(Dlink* plink)
{
plink->head = plink->tail = NULL;
plink->size = 0;
}
列表释放:
void free_list(Dlink* plink) {
Dnode* current = plink->head;
while (current != NULL&¤t->next!=NULL) {
Dnode* next = current->next;
free(current);
current = next;
}
plink->head = plink->tail = NULL;
plink->size = 0;
}
push,pop等操作:
void push(Dlink* plink, int x)
{
assert(plink);
Dnode* New = Newnode(x);
if (plink->head == NULL)
{
plink->head = plink->tail = New;
}
else
{
New->next = plink->head;
plink->head->prev = New;
plink->head = New;
}
plink->size++;
}
void pop(Dlink* plink)
{
assert(plink);
if (plink->head == NULL)
{
printf("error\n");
return;
}
else
{
if (plink->size == 1)
{
Dnode* sid = plink->head;
printf("%d\n", sid->val);
plink->head = plink->tail = NULL;
free(sid);
plink->size--;
}
else if (plink->size != 1)
{
Dnode* mid = plink->head;
plink->head = plink->head->next;
// plink->head->prev = NULL;访问冲突,不能对空置空
printf("%d\n", mid->val);
free(mid);
plink->size--;
}
}
}
void top(Dlink* plist)
{
assert(plist);
if (plist->head == NULL)
{
printf("error\n");
}
else
printf("%d\n", plist->head->val);
}
访问冲突原因及解决办法:
原因:访问了已经无法读取的节点,访问方式包括但不限于
head->next(空)!=NULL;
head->prev(空)=NULL;
解决方法可以使用size变量代替访问内存。