[笔记]指针与队列
与堆很相像的是队列(queue),但它是一种先进先出(first in last out)的表示方式,我们可以将队列视为一种添加在后端,而删除在前端的链表,我们用一段简单的代码来表示:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Insert();
void Delete();
void Dispaly();
void Quit();
struct student
{
int id;
int score;
struct student* next;
};
typedef struct student ST;
ST* p, * head, * s, * s1;
int main()
{
head = (ST*)malloc(sizeof(ST));
head->next = NULL;
char a;
while (1)
{
printf("请输入:1.增加,2.删除,3.遍历,4.退出\n");
a = getch();
switch (a)
{
case'1':
Insert();
break;
case'2':
Delete();
break;
case'3':
Dispaly();
break;
case'4':
Quit();
break;
}
}
return 0;
}
void Insert()
{
p = (ST*)malloc(sizeof(ST));
printf("\n请输入ID:");
scanf("%d", &p->id);
printf("\n请输入分数:");
scanf("%d", &p->score);
s1 = head;
s = head->next;
while (s != NULL)
{
s1 = s;
s = s->next;
}
s1->next = p;
p->next = s;
printf("\n添加成功\n\n");
}
void Delete()
{
char x;
s1 = head;
s = head->next;
if (head->next == NULL)
{
printf("\n无数据\n\n");
}
else
{
printf("\n确定删除:Y/y");
x = getch();
if (x == 'Y' || x == 'y')
{
s1->next = s->next;
free(s);
printf("\n删除成功\n");
}
}
}
void Dispaly()
{
if (head->next == NULL)
{
printf("\n无数据\n\n");
}
else
{
s = head->next;
while (s != NULL)
{
printf("\nid是:%d\t学分是:%d\n", s->id, s->score);
s = s->next;
}
}
}
void Quit()
{
exit(0);
}
在上一文的栈实现代码中,我添加了一个指针s1,用它控制头节点,当然也可以不添加,只是习惯问题罢了
如上文所述,与栈不同的是,栈是先进先出,添加和删除都在前端,而队列是添加在尾端,而删除在前端。
那么我们只需要修改添加的函数即可,先利用一个while循环使他走向尾端,当尾端后为NULL的时候,使尾端节点的指针域指向新结点即可
s1用于管理头结点,s用于管理后置节点
当后边没数据的时候,直接将头节点的指针域链接新结点,然后将新节点的指针域指向NULL(代码中指向了头节点的指针域)
添加和删除跟栈操作相同,其实在我们接触单双链的时候,就已经清楚的明白了链表的运作方式,和各项基本操作
在这里就不多废话了,在以后学习数据结构中,对于链式结构会有一个新的认识,到这里只是简单的接触罢了。