标签:
队列
(1)队列是一种先进先出的线性表
(2)只能从队头进行删除,从队尾进行插入
(一)链队列
(1)需要一个指向头结点的头指针和一个指向尾结点的尾指针
(2)通常为了操作的方便起见,都会给链队添加一个头结点,头结点不存数据。
(3)有头结点的链队列判空的条件是头指针和尾指针都指向头结点
链队列的实现代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define STACK_INIT_SIZE 100 4 #define STACKINCREMENT 10 5 typedef int Status; 6 #define OK 1 7 #define ERROR 0 8 typedef struct QNode 9 { 10 char data; 11 struct QNode *next; 12 }QNode, *QueuePtr; 13 14 typedef struct { 15 QueuePtr front; 16 QueuePtr rear; 17 }LinkQueue; 18 19 //创建队列 20 void InitQueue(LinkQueue *Q) 21 { /* 构造一个空队列Q */ 22 (*Q).front = (*Q).rear = (QueuePtr)malloc(sizeof(QNode)); 23 if (!(*Q).front) exit(0); 24 (*Q).front->next = NULL; 25 } 26 27 //入队 28 void EnQueue(LinkQueue *Q, char e) 29 { /* 插入元素e为Q的新的队尾元素 */ 30 QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); 31 if (!p) exit(0); /* 存储分配失败 */ 32 p->data = e; p->next = NULL; 33 (*Q).rear->next = p; (*Q).rear = p; 34 } 35 36 //出队 37 void DeQueue(LinkQueue *Q, char *e) 38 { /* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */ 39 QueuePtr p; 40 if ((*Q).front == (*Q).rear) exit(0); /* 空队列退出 */ 41 p = (*Q).front->next; 42 *e = p->data; 43 (*Q).front->next = p->next; 44 if ((*Q).rear == p) (*Q).rear = (*Q).front; 45 free(p); 46 } 47 48 //输入队列内容 49 void printfQueue(LinkQueue Q) 50 { 51 QueuePtr p; 52 p = Q.front->next; 53 while (p) 54 { 55 printf("%c ", p->data); 56 p = p->next; 57 } 58 printf("\n"); 59 } 60 61 int main() 62 { 63 LinkQueue Q; 64 char e; 65 InitQueue(&Q); 66 67 int num, i; 68 char a,c; 69 printf("输入入队元素个数:\n"); 70 scanf("%d", &num); 71 c = getchar(); 72 printf("输入入队元素:\n"); 73 74 for (i = 0; i < num; i++){ 75 scanf("%c", &a); 76 c = getchar(); 77 EnQueue(&Q, a); 78 } 79 printf("队里的元素为:"); 80 printfQueue(Q); 81 printf("出队顺序为:"); 82 for (i = 0; i < num; i++){ 83 DeQueue(&Q, &e); 84 printf("%c ",e); 85 } 86 system("pause"); 87 return 0; 88 }
标签:
原文地址:http://www.cnblogs.com/cdoublej/p/5424753.html