话不多说,直接代码
1 #include"stdio.h" 2 #include"stdlib.h" 3 typedef struct QNode{ 4 int date; 5 struct QNode *next; 6 }QNode,*QueuePtr; 7 typedef struct{ 8 QueuePtr front; 9 QueuePtr rear; 10 }LinkQueue; 11 //初始化 12 int InitStack(LinkQueue &S){ 13 S.front=(QueuePtr)malloc(sizeof(QNode)); 14 //S.front=NULL; 15 S.rear=S.front; 16 if(!S.front) 17 return 0; 18 S.front->next=NULL; 19 return 1; 20 } 21 //进 22 int EnQueue(LinkQueue &S,int e){ 23 QueuePtr p=NULL; 24 p=(QueuePtr)malloc(sizeof(QNode)); 25 if(!p)exit(1); 26 p->date=e; 27 p->next=0; 28 S.rear->next=p; 29 S.rear=p; 30 return 1; 31 } 32 //置空 33 void ClearQueue(LinkQueue &S){ 34 QueuePtr p=NULL; 35 p=S.front; 36 while(S.front!=S.rear){ 37 p=S.front->next; 38 free(S.front); 39 S.front=p; 40 } 41 } 42 //判空 43 void QueueEmpty(LinkQueue &S){ 44 if(S.front==S.rear) 45 printf("判空:是 "); 46 else 47 printf("判空:否 "); 48 49 } 50 //长度 51 int QueueLen(LinkQueue &S){ 52 QueuePtr p=NULL; 53 int len=0; 54 p=S.front; 55 if(S.front==S.rear) 56 return len; 57 else{ 58 while(p!=S.rear){ 59 len++; 60 p=p->next; 61 } 62 return len; 63 } 64 } 65 void len(LinkQueue &S){ 66 printf("%d ",S.front); 67 printf("%d ",S.front->next); 68 printf("%d ",S.rear); 69 printf("大小%d ",sizeof(QNode)); 70 printf("%d ",S.rear-S.front->next); 71 printf("%d ",S.rear-S.front); 72 printf("%d ",(S.rear-S.front->next)/sizeof(QNode)); 73 74 } 75 //出 76 int pop(LinkQueue &S){ 77 int tem=0; 78 QueuePtr p=NULL; 79 if(S.front->next==NULL) 80 return 0; 81 else{ 82 tem=S.front->next->date; 83 p=S.front->next; 84 free(S.front); 85 S.front=p; 86 return tem; 87 } 88 } 89 //输出 90 void QueueTraverse(LinkQueue &S){ 91 printf("输出:"); 92 QueuePtr p=S.front; 93 while(p!=S.rear){ 94 printf("%d ",p->next->date); 95 p=p->next; 96 } 97 98 } 99 void main(){ 100 LinkQueue S; 101 printf("初始化:"); 102 printf("%d ",InitStack(S)); 103 printf("%d ",EnQueue(S,1)); 104 printf("%d ",EnQueue(S,2)); 105 printf("%d ",EnQueue(S,3)); 106 printf("%d ",EnQueue(S,4)); 107 printf("%d ",EnQueue(S,5)); 108 printf("长度:%d ",QueueLen(S)); 109 len(S); 110 QueueTraverse(S); 111 printf("输出:%d ",pop(S)); 112 QueueTraverse(S); 113 EnQueue(S,9); 114 QueueTraverse(S); 115 QueueEmpty(S); 116 ClearQueue(S); 117 QueueEmpty(S); 118 }
在使用构造体的时候注意应该有两个构造体,分别对应整个链表和链表的一个结点。
在获取队列长度的时候不能像栈一样队首队尾直接相减,具体我也搞不懂为什么,代码中的len函数就是对该方法的测试。
另外,一定在。要注意S.front并不是第一个元素的位置,S.front->next才是,见图