使用带sentinel哨兵的双向链表实现栈和队列

最近复习数据结构,这个主题参考了《LINUX一站式编程》,有一些改动。这个代码在linux 64位机器使用gcc下编译通过,在windows 32位机器使用visual studio 6.0编译通过,但是,在linux 64机器使用g++无法编译通过。报错出现在headsentinel和tailsentinel的定义部分,具体原因还没有弄清楚。。。。

函数的定义文件如下

#ifndef LINKEDLISTDEQUE_H
#define LINKEDLISTDEQUE_H
typedef struct node *link;
struct node{
    unsigned char item;
    link prev;
    link next;

};
link make_node(unsigned char item);
void free_node(link p);
link search_1(unsigned char key);
void insert_at_head(link p);
void insert_at_tail(link p);
void delete_node_1(link p);
void delete_node_2(link p);
void traverse(void (*visit)(link));
void destroy(void);
void push(link p);
link pop(void);
void enqueue(link p);
link dequeue(void);
int test();
#endif

函数的实现文件如下

#include <stdlib.h>
#include "linkedlistdeque.h"
struct node tailsentinel;
struct node headsentinel={0,NULL,&tailsentinel};
struct node tailsentinel={0,&headsentinel,NULL};

int test()
{
   tailsentinel.item=0;
   return 0;
}
static link head = &headsentinel;
static link tail = &tailsentinel;
link make_node(unsigned char item)
{
    //link p = new node; 
    link p = malloc(sizeof *p); //为了使用gcc编译而非使用g++编译,采用了malloc而非new形式分配空间。
    p->item=item;
    p->next=NULL;
    return p;
}

void free_node(link p)
{
    free(p);
}


link search_1(unsigned char key)
{
    link p;
    for(p=head->next;p!=tail;p=p->next)
    {
        if(p->item == key)
            return p;
    }
    return NULL;
}

void insert_at_head(link p)
{
    p->next=head->next;
    head->next->prev=p;
    head->next=p;
    p->prev=head;
}

void insert_at_tail(link p)
{
    p->next = tail;
    tail->prev->next = p;
    p->prev = tail->prev;
    tail->prev=p;
    return ;
}


void delete_node_1(link p)
{
    p->prev->next=p->next;
    p->next->prev=p->prev;
}

void delete_node_2(link p)
{
    p->prev->next=p->next;
    p->next->prev=p->prev;
}
void traverse(void (*visit)(link))
{
    link p;
    for(p=head->next;p!=tail;p=p->next)
        visit(p);
}

void destroy(void)
{
    link p= head->next;
    link q= head->next; 
    head->next = tail;
    tail->prev = head;
    while(p!=tail) {
        q = p;
        p = p->next;   
        free_node(q);
    }

}

void push(link p)
{
    insert_at_head(p);
    return;
}

link pop(void)
{
    if(head ==tail) {
        return NULL;
    } else {
        link p = head;
        head = head->next;
        return p;
    }
}


void enqueue(link p)
{
   insert_at_tail(p);
   return;
}

link dequeue(void)
{
    if(tail->prev==head) {
        return NULL;
    }else{
        link p = head->next;
        delete_node_1(p);
        return p;
    }
}

main函数如下

#include <stdio.h>
#include "linkedlistdeque.h" 

void print_item(link p)
{
    printf("%d\n",p->item);
}

int main()
{
    link p =  make_node(10);
    push(p);
    p =  make_node(5);
    push(p);
    p =  make_node(50);
    push(p);
    p =  make_node(55);
    push(p);
    p =  make_node(60);
    push(p);
    traverse(print_item);
    printf("------------\n");
    p = search_1(5);
    delete_node_1(p);
    free_node(p);
    p = search_1(60);
    delete_node_2(p);
    free_node(p);
    traverse(print_item);
    destroy();


  

    printf("------------\n");
    p =  make_node(100);
    enqueue(p);
    p =  make_node(150);
    enqueue(p);
    p =  make_node(200);
    enqueue(p);
    p =  make_node(250);
    enqueue(p);
    traverse(print_item);
    printf("------------\n");
    p=dequeue(); 
    while(p!=NULL) {
        print_item(p);
        free_node(p);
        p=dequeue();
    }


    return 0;
}





你可能感兴趣的:(使用带sentinel哨兵的双向链表实现栈和队列)