链栈与链队列
程序员文章站
2022-07-14 13:10:07
...
链栈与链队列
想想是该整理一下学长一钱不值的链栈与链队列的任务,,不知道自己这样写的有没有问题,符不符合原理,如果有什么问题,请大家能不吝赐教,帮忙斧正。
链栈
首先,我们先搞清楚,栈的原理就是现金后出,譬如往箱子里面放球,最先放进去的最后拿出来。下面给一下我臭臭的代码:
#include<stdio.h>
#include<stdlib.h>
//定义结构体
struct node{
int data;
struct node* next;
};
int main()
{
//这是之前学过的创建链表的代码,就不阐述了
struct node *head,*p,*q,*t;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
int a,n;
scanf("%d",&n);//输入n个数
for(int i=0;i<n;++i){
scanf("%d",&a);
p=(struct node*)malloc(sizeof(struct node));
p->data=a;
head->next=p;
if(head->next==NULL)
p->next=NULL;
else{
p->next=q ;
}
q=p;
}
//打印创建的链表
t=head->next;
while(t!=NULL){
printf("%d",t->data);
t=t->next;
}
//链栈:先入后出,因此新入的数应该在头指针的后面
for(int i=0;i<n;++i){
scanf("%d",&a);
p=(struct node*)malloc(sizeof(struct node));//给输入的数a创建一处空间
p->data=a;
head->next=p;//将头指针的位置指向新入栈的数
if(head->next==NULL)
p->next=NULL;//如果是第一个数那么入栈的数指向为空
else{
p->next=q ;//否则指向前一个数
}
q=p;//记录上一个入站的值
}
//打印链栈
t=head->next;
while(t!=NULL){
printf("%d",t->data);
t=t->next;
}
## 链队列
队列即是先进后出,就像平时就餐排队一样,这里我模拟了一人入队就有一人出队的环境。
````c
#include<stdio.h>
#include<stdlib.h>
//定义结构体
struct node{
int data;
struct node* next;
};
int main()
{
//创建链表
struct node *head,*p,*q,*t;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
int a,n;
scanf("%d",&n);//输入n个数,从而创建一个长度为n的链表
for(int i=0;i<n;++i){
scanf("%d",&a);
p=(struct node*)malloc (sizeof(struct node));
p->data=a;
p->next=NULL;
if(head->next==NULL)
head->next=p;
else
q->next=p;
q=p;
}
printf("\n");
//打印该链表
t=head->next;
while(t!=NULL){
printf("%d",t->data);
t=t->next;
}
//进入新元素
while(scanf("%d",&a)&&a!=-1){//当输入的数不为-1则继续输入
p=(struct node*)malloc(sizeof(struct node));//为新的数申请空间
p->data=a;
head->next=head->next->next;//让排在最前面的数出队列
q->next=p;/*q因为经过上面创建来链表的过程,所以已经是整个队中最后一个
让他指向新数*/
p->next=NULL;//最后入队的数指向为空
/*打印链表看是否完成操作,该为测试代码,可省去
t=head->next;
while(t!=NULL){
printf("%d",t->data);
t=t->next;
}
*/
printf("\n");
q=p;记录新入栈的元素
}
//打印链表
t=head->next;
while(t!=NULL){
printf("%d",t->data);
t=t->next;
}
}
上一篇: GNU-GCC编译选项