简单链表实现队列

it2026-04-05  3

简单链表实现队列

最近开始学习数据结构,这里贴上自己的练习代码,用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; }

链队列较循环队列比较灵活,在不知道最大数组元素的情况下用链队列十分友好,以上代码仅仅是随笔测试,肯定会有很多可以改进的地方,比如双向链表只需要定义一个头结点组成循环链表会更简洁之类的。。

最新回复(0)