1. 程式人生 > 實用技巧 >資料結構C語言實現----出隊伍操作

資料結構C語言實現----出隊伍操作

1.建立一個佇列時,空佇列中隊首和隊尾相同,但不是NULL,隊首後面掛的元素才是NULL

2.列印佇列時,對於鏈佇列,不能把指標加一來找到下一個資料,因為連結串列地址不連續,需要複製一條連結串列,不斷往後遍歷來挨個列印連結串列的資料

3.求隊伍的長度也是,不能首尾指標相減,因為地址不連續,所以同樣需要複製一條連結串列,通過遍歷來求長度

程式碼如下:

#include<stdlib.h>
#include<stdio.h>
/*************************************
* 出佇列操作
* 隊首(頭指標)---元素1----元素2---元素3---.....
* 將隊首指向元素2,釋放掉元素1
* 注意1:佇列原本為空佇列,直接返回
* 注意2:釋放掉第一個元素後,佇列變為空佇列,別忘了讓隊尾 = 隊首
* ***************************************************************/
//typedef char ElemType;
typedef struct QNode
{
char date;
struct QNode *next;
}QNode , *QueuePtr;
typedef struct
{
QueuePtr front , rear;
}LinkQueue;
/////////////////////////////////////////////////////////////////////
//建立一個佇列
void initQueue(LinkQueue *q)
{
q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
if (!q->front)
{
exit(0);
}
q->front->next = NULL;//這時頭結點後面連線的是NULL,但本身不是NULL
}
/////////////////////////////////////////////////////////////////////
//入佇列操作
void EnQueue(LinkQueue *q , char e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (!q->front)
{
exit(0);
}
p->date = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
////////////////////////////////////////////////////////////////////
//出佇列操作
void DeQueue(LinkQueue *q , char *e)
{
if (q->front == q->rear)//判斷是否為空佇列
{
return;
}
QueuePtr p;
p = q->front->next;
*e = p->date;
q->front->next = p->next;
if (q->rear == p)
{
q->front = q->rear;
}
free(p);
}
/////////////////////////////////////////////////////////////////////
//計算佇列長度
int LenLinkQueue(LinkQueue *q)
{
int len,i;
QueuePtr p = q->front->next;
for (i = 0; p!=NULL;i++)
{
p = p->next;
}
return i;
} int main()
{
LinkQueue q;
char e;
//建立佇列
initQueue(&q);
printf("佇列建立中,請稍後...\n佇列建立成功!\n");
//入佇列操作
printf("請輸入要插入佇列的字元:");
while ((e = getchar())!= '\n')
{
if (e!='\n')
{
EnQueue(&q , e);
}
}
//列印佇列
printf("插入成功,正在列印佇列字元...\n");
printf("當前佇列為:");
int len = LenLinkQueue(&q);//隊伍長度
QueuePtr p = q.front->next;//連結串列不同於順序表,地址不連續,所以不能通過指標的增減來列印,需要複製一個連結串列遍歷
for (size_t i = 0;i<len ; i++)
{
printf("%c" , p->date);
p = p->next;
}
putchar('\n');
//出隊伍
printf("請輸入需要幾個元素從隊首出佇列:");
int n;
scanf("%d",&n);
while (n)
{
DeQueue(&q , &e);
printf("%c已從隊首出佇列\n" ,e);
n--;
}
//列印隊伍
printf("插入成功,正在列印佇列字元...\n");
printf("當前佇列為:");
p = q.front->next;
for (size_t i = 0;i<len ; i++)
{
printf("%c" , p->date);
p = p->next;
}
putchar('\n');
return 0;
}

  

執行結果: