本文實例為大家分享了C語言實現鏈隊列的具體代碼,供大家參考,具體內容如下
源文件部分: 指針沒學好的同學很難看懂^_^,有點亂,希望對大家有點幫助。
#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>typedef int Elemtype;#include"LQueue.h"int main(){ Deque head; instruction(head); return 0;}頭文件部分:typedef struct Queue{ Elemtype data; struct Queue *next;}LQnode,*LQueue; typedef struct{ LQnode *front; LQnode *rear;}Deque; void Init_queue(Deque *head) //初始化+清空操作==其實這里的清空是指將頭節點后的節點給丟棄掉 { LQnode *p=NULL; p=(LQueue)malloc(sizeof(LQnode)); head->front=p; head->rear=p; p->next=NULL;} int Empty_queue(Deque *head) //判空{ if(head->front->next==head->rear->next) return 1; return 0;} int Lenght_queue(Deque arrow){ LQnode *p=NULL; int len=0; p=arrow.front->next; while(p) { len++; p=p->next; } return len;} void Enqueue(Deque *arrow,Elemtype e) //入隊操作{ LQueue p=NULL; p=(LQueue)malloc(sizeof(LQnode)); if(!p) { printf("已無更多的內存單元得到分配!/n"); return ; } p->data=e; p->next=NULL; //插入時,隊首指針是不需要動的 arrow->rear->next=p; arrow->rear=p; return ;} void Dequeue(Deque *arrow,Elemtype *e) //出隊操作{ LQnode *p=NULL; if(Empty_queue(arrow)) { printf("當前鏈隊列為空,無法完成出隊操作!!!/n"); return ; } p=arrow->front->next; (*e)=p->data; arrow->front->next=p->next; printf("元素%d已退出隊列!!!/n",*e); if(Lenght_queue(*arrow)==0) return ; //當最后一個元素出列以后,arrow->rear不知道指向了哪里 free(p); return ;} int Queue_top(Deque *arrow) //返回隊首元素 { if(Empty_queue(arrow)) { printf("當前鏈隊列為空,隊首元素不存在!!!/n"); return 0; } printf("當前隊首元素是:%d/n",arrow->front->next->data);} void Destroy_queue(Deque *arrow) //鏈隊列的銷毀{ LQnode *p=NULL; if(Empty_queue(arrow)) { printf("當前鏈隊列為空,無須完成銷毀操作!!!/n"); return ; } while(arrow->front->next) { p=arrow->front->next; arrow->front->next=p->next; if(Lenght_queue(*arrow)==0) break; free(p); } printf("銷毀成功!/n"); return ;} void Print_queue(Deque arrow){ LQnode *p=NULL; p=arrow.front->next; while(p) { printf("%d ",p->data); p=p->next; } printf("/n");} void Modify_queue(Deque *arrow,Elemtype index,Elemtype e) //修改函數{ int i=0; LQnode *p=NULL; p=arrow->front->next; while(i<index-1) { p=p->next; } p->data=e; printf("已完成修改操作!/n");} int Insearch_queue(Deque arrow,Elemtype e) //查找函數{ LQnode *p=NULL; int i=1; if(Empty_queue(&arrow)) { printf("當前鏈隊列為空,沒有元素可查找!!!/n"); return 0; } p=arrow.front->next; while(p!=NULL) { if(e==p->data) { return i; break; } i++; p=p->next; } if(p==NULL) printf("查找失敗,隊列內無該元素存在!/n"); return 0;} void instruction(Deque head){ int n,m,t,a,b,len1,index; printf("/t/t1、隊列初始化 /n"); printf("/t/t2、新增隊列元素/n"); printf("/t/t3、返回隊首元素/n"); printf("/t/t4、元素出隊列 /n"); printf("/t/t5、查找隊列元素/n"); printf("/t/t6、修改隊列元素/n"); printf("/t/t7、銷毀隊列 /n"); printf("/t/t8、隊列的長度 /n"); printf("/t/t9、打印隊列元素/n"); printf("/t/t10、退出程序 /n"); printf("請輸入你所需要完成的指令:/n"); do{ scanf("%d",&n); if(n<1||n>10) printf("對不起,你輸入的指令編號是無效的,請重新輸入!!!/n"); }while(n<1||n>10); switch(n) { case 1: Init_queue(&head); printf("已完成鏈隊列初始化,請輸入你要添加的元素個數!/n"); scanf("%d",&n); while(n--) { int x; scanf("%d",&x); Enqueue(&head,x); } printf("完成建隊操作!/n"); break; case 2: printf("請輸入你要添加的元素個數!/n"); scanf("%d",&n); while(n--) { int x; scanf("%d",&x); Enqueue(&head,x); } printf("增添成功!/n"); break; case 3: Queue_top(&head); break; case 4: Dequeue(&head,&t); break; case 5: printf("請輸入你所要查找的元素:/n"); scanf("%d",&m); index=Insearch_queue(head,m); if(index) printf("你所要查找的元素位于隊列的第%d個位置上!!!/n",index); break; case 6: printf("請輸入你更改的元素隊列位置:/n"); do{ scanf("%d",&a); if(a<1||a>Lenght_queue(head)) printf("對不起,你所輸入的元素位置不在區域內,請重新輸入!!!/n"); }while(a<1||a>Lenght_queue(head)); printf("請輸入修改后的值:/n"); scanf("%d",&b); Modify_queue(&head,a,b); break; case 7: Destroy_queue(&head); break; case 8: len1=Lenght_queue(head); printf("當前鏈隊列的長度為:%d/n",len1); break; case 9: Print_queue(head); break; case 10: return; default: instruction(head); break; } instruction(head);}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答