简单链表实现队列
最近开始学习数据结构,这里贴上自己的练习代码,用c语言实现链表的简单出队和入队,因为是初心者有误的地方希望能不吝赐教。
头文件定义:
#ifndef _LINK_H
#define _LINK_H
typedef int data_t;
typedef struct node{
data_t data;
struct node *next;
struct node *previous;
}link,*link_t;
typedef struct{
link_t head;
link_t last;
}queue,*queue_t;
queue_t createLinkqueue();
int pushLinkqueue(queue_t,data_t);
int popLinkqueue(queue_t);
#endif
函数包:
#include <strings.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "link.h"
queue_t createLinkqueue()
{
queue_t sq = (queue_t)malloc(sizeof(queue));
if(sq == NULL)
return (queue_t)-1;
sq->head = (link_t)malloc(sizeof(link));
sq->last = (link_t)malloc(sizeof(link));
if((sq->head == NULL)&&(sq->last == NULL))
return (queue_t)-1;
sq->head->data = sq->last->data = -1;
sq->head->next = sq->last;
sq->head->previous = NULL;
sq->last->previous = sq->head;
sq->last->next = NULL;
return sq;
}
int pushLinkqueue(queue_t sq,data_t data)
{
if(sq == NULL)
return -1;
link_t l = (link_t)malloc(sizeof(link));
l->data = data;
l->next = sq->head->next;
sq->head->next->previous = l;
l->previous = sq->head;
sq->head->next = l;
return 0;
}
int popLinkqueue(queue_t sq)
{
if(sq == NULL)
return -1;
if(sq->last->previous == sq->head){
printf("null!\n");
return -1;
}
int num = sq->last->previous->data;
sq->last->previous->previous->next = sq->last;
sq->last->previous = sq->last->previous->previous;
return num;
}
简单测试代码:
#include <stdio.h>
#include "link.h"
int main(int argc,char *argv[])
{
queue_t sq = createLinkqueue();
int i = 0;
for(;i<100;i++)
pushLinkqueue(sq,i);
printf("popLinkqueue:%d\n",popLinkqueue(sq));
for(i=0;i<99;i++)
printf("popLinkqueue:%d\n",popLinkqueue(sq));
return 0;
}
链队列较循环队列比较灵活,在不知道最大数组元素的情况下用链队列十分友好,以上代码仅仅是随笔测试,肯定会有很多可以改进的地方,比如双向链表只需要定义一个头结点组成循环链表会更简洁之类的。。