第二章 栈,队列,链表
#include<stdio.h>
int main(){
int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;
int i;
head=1;
tail=10;
while(head<tail)
{
printf("%d",q[head]);
head++;
q[tail]=q[head];
tail++;
head++;
}
getchar();getchar();
return 0;
}
最后输出:6 1 5 9 4 7 2 8 3
使用结构体来实现队列操作
#include<stdio.h>
struct queue
{
int data[100];
int head;
int tail;
};
int main()
{
struct queue q;
int i;
q.head=1;
q.tail=1;
for(i=1;i<=9;i++)
{
scanf("%d",&q.data[q.tail]);
q.tail++;
}
while(q.head<q.tail)
{
printf("%d ",q.data[q.head]);
q.head++;
q.data[q.tail]=q.data[q.head];
q.tail++;
q.head++;
}
getchar();getchar();
return 0;
}
用栈来判断回文字符
#include<stdio.h>
#include<string.h>
int main()
{
char a[101],s[101];
int i,len,mid,next,top;
gets(a);
len=strlen(a);
mid=len/2-1;
top=0;
for(i=0;i<=mid;i++)
s[++top]=a[i];
if(len%2==0)
next=mid+1;
else
next=mid+2;
for(i=next;i<=len-1;i++)
{
if(a[i]!=s[top])
break;
top--;
}
if(top==0)
printf("YES");
else
printf("NO");
getchar();getchar();
return 0;
}
输入
ahaha
运行结果是
YES
纸牌游戏 规则:将一副扑克牌平均分成两份,每人拿一份。小恒先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小恒刚打出的扑克牌上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
#include<stdio.h>
struct queue
{
int data[1000];
int head;
int tail;
};
struct stack
{
int data[10];
int top;
};
int main()
{
struct queue q1,q2;
struct stack s;
int book[10];
int i,t;
q1.head=1;q1.tail=1;
q2.head=1;q2.tail=1;
s.top=0;
for(i=1;i<=9;i++)
book[i]=0;
for(i=1;i<=6;i++)
{
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
for(i=1;i<=6;i++)
{
scanf("%d",&q2.data[tail]);
q2.tail++;
}
while(q1.head<q1.tail&&q2.head<q2.tail)
{
t=q1.data[q1.head];
if(book[t]==0)
{
q1.head++;
s.top++;
s.data[s.top]=t;
book[t]=1;
}
else
{
q1.head++;
q1.data[q1.tail]=t;
q1.tail++;
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}
}
t=q2.data[q2.head];
if(book[t]==0)
{
q2.head++;
s.top++;
s.data[s.top]=t;
book[t]=1;
}
else
{
q2.head++;
q2.data[q2.tail]=t;
q2.tail++;
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
}
}
if(q2.head==q2.tail)
{
printf("小恒win\n");
printf("小恒当前手中的牌是");
for(i=q1.head;i<=q1.tail-1;i++)
printf(" %d",q1.data[i]);
if(s.top>0)
{
printf("\n桌上的牌是");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);
}
else
printf("\n桌上已经没有牌了");
}
else
{
printf("小哈win\n");
printf("小哈当前手中的牌是");
for(i=q2.head;i<=q2.tail-1;i++)
printf(" %d",q2.data[i]);
if(s.top>0)
{
printf("\n桌上的牌是");
for(i=1;i<=s.top;i++)
printf(" %d",s.data[i]);
}
else
printf("\n桌上已经没有牌了");
}
getchar();getchar();
return 0;
}
输入
2 4 1 2 5 6
3 1 3 5 6 4
运行结果是
小恒win
小恒当前手中的牌是 5 6 2 3 1 4 6 5
桌上的牌是 2 1 3 4
该程序的缺陷:有可能游戏无法结束。
链表
指针的作用:存储一个地址,确切的说是存储一个内存空间的地址
通过操作指针来输出变量的值
#include<stdio.h>
int main()
{
int a=10;
int *p;
p=&a;
printf("%d",*p);
getchar();getchar();
return 0;
}
这里printf语句中的号叫做间接运算符,作用是获取指针p所指向的内存中的值。在C语言中有三个用途 ①乘号,用作乘法运算 ②申明一个指针,在定义指针变量时使用,例如int *p ③间接运算符,获取指针所指向的内存中的值,例如printf("%d",*p)
malloc函数的作用就是从内存中申请分配指定字节大小的内存空间。如malloc(4)就申请了4个字节。还可用sizeof(int)来获取类型所占用的字节数。malloc(sizeof(int)).
int *p
p=(int *)malloc(sizeof(int));
malloc函数的返回类型是void * 类型,void *表示未确定类型的指针。在C语言中,void *类型可以强制转换为任何其他类型的指针。 Q:指针就是用来存储内存地址的,为什么要分不同类型的指针 A:因为指针变量存储的是一个内存空间的首地址(第一个字节的地址),但是这个空间占用了多少字节,用来存储什么类型的数据,则是由指针的类型来标明的,这样系统才知道取多少个连续内存作为一个数据。
通过指针对刚才申请的4字节的空间进行操作,项这个空间中存入整数10
#include<stdio.h>
#include<stdlib>
int main()
{
int *p;
p=(int *)malloc(sizeof(int));
*p=10;
printf("%d",*p);
return 0;
}
运行结果是 10
有了malloc函数,方便我们在程序运行过程中根据实际情况来申请空间。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node,*head,*p,*q,*t;
int i,n,a;
scanf("%d",&n);
head=NULL;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
p=(struct node *)malloc(sizeof(struct node));
p->data=a;
p->next=NULL;
if(head==NULL)
head=p;
else
q->next=p;
q=p;
}
scanf("%d",&a);
t=head;
while(t!=NULL)
{
if(t->next->data>a)
{
p=(struct node *)malloc(sizeof(struct node));
p->data=a;
p->next=t->next;
t->next=p;
break;
}
t=t->next;
}
t=head;
while(t!=NULL)
{
printf("%d",t->data);
t=t->next;
}
return 0;
}
设置头指针并设置新创建结点的*next指向空,头指针的作用是方便以后从头遍历整个链表。
输入
9
2 3 5 8 9 10 18 26 32
运行结果
2 3 5 8 9 10 18 26 32
上面这段代码没有释放动态申请的空间,虽然没有错误,但很不安全。
|