C语言怎么不用数组和指针实现字符串的反向输出
发布网友
发布时间:2022-04-08 17:51
我来回答
共3个回答
热心网友
时间:2022-04-08 19:21
看题意是应该用栈来处理,不过指针不用主要是指不用数组及字符指针来处理反向输出,c语言要是真离开了指针,可就寸部难行了(就像没了内存一样),下面程序确实只用一个变量,完全用栈来处理输出,并避开了字符指针,已调试通过。
#include "stdio.h"
#include "conio.h"
// 栈大小
#define MAX_STACK 100
// 栈顶,只有这一个变量
static unsigned long stack_top=0;
// 栈操作,当栈溢出时,自动丢弃最早压入的数据
// c!=0 push c, c==0 pop c, return c
char stack(char c)
{
// 回车退出
if(c=='\r')
return c;
if(c) // push
{
memmove((void*)(stack_top+1),(void*)stack_top,MAX_STACK-1);
memset((void*)(stack_top),c,1);
}
else // pop
{
memmove((void*)&c,(void*)stack_top,1);
memmove((void*)stack_top,(void*)(stack_top+1),MAX_STACK-1);
}
return c;
}
int main(int argc, char* argv[])
{
// 初始化栈
stack_top = (unsigned long) alloca(MAX_STACK);
memset((void*)(stack_top),0,MAX_STACK);
printf("input string and CR end\n");
//压栈
while(stack( putch( getch()) )!='\r');
printf("\n");
// 反向输出,出栈
while( putch(stack( 0 ))> 0);
printf("\n");
return 0;
}
热心网友
时间:2022-04-08 20:39
提示:递归函数
参考资料:作业还是自己完成吧
热心网友
时间:2022-04-08 22:13
可以用链表,一看你的问题,不用数组和指针我也不会,我也是搜的……
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct string)
struct string{
struct string *before;
char ch;
struct string *next;
};
struct string *creat(void)
{
struct string *head;
struct string *p1,*p2;
int n=0;
p1=p2=(struct string*)malloc(LEN);
scanf("%c",&p1->ch);
head=NULL;
while(p1->ch!='\n')
{
n++;
if(n==1)head=p1;
else
{
p2->next=p1;
p1->before=p2;
p2=p1;
p1=(struct string*)malloc(LEN);
scanf("%c",&p1->ch);
}
}
p2->next=NULL;
return head;
}
struct string *input(void)
{
struct string *head;
struct string *p1,*p2;
p1=(struct string*)malloc(LEN);
scanf("%c",&p1->ch);
p2=head=p1;
while(p1->ch!='\n')
{
p1=(struct string*)malloc(LEN);
scanf("%c",&p1->ch);
p2->next=p1;
p1->before=p2;
p2=p1;
}
p2->next=NULL;
return head;
}
struct string *danxiang(void)
//反向输入函数
{
struct string *end;
struct string *p1,*p2;
p1=(struct string*)malloc(LEN);
scanf("%c",&p1->ch);
p2=p1;
p2->before=NULL;
while(p1->ch!='\n')
{
p1=(struct string*)malloc(LEN);
scanf("%c",&p1->ch);
p1->before=p2;
p2=p1;
}
end=p1;
p1->next=NULL;
return end;
}
print2(struct string *end)
//反向输出函数
{
struct string* p;
printf("\n反向输出结果为:\n");
for(p=end;p!=NULL;p=p->before)
{
printf("%c",p->ch);
}
putchar('\n');
}
//双向链表输出函数
print(struct string *head)
{
struct string *p;
p=head;
while(p->next!=NULL)
{
p=p->next;
}
printf("\n反向输出结果为:\n");
while(p!=head)
{
printf("%c",p->ch);
p=p->before;
};
printf("%c\n",head->ch);
putchar('\n');
}
shuchu1(void)
{
struct string *number;
number=creat();
print(number);
}
shuchu2(void)
{
struct string *number;
number=input();
print(number);
}
shuchu3(void)
{
struct string *number;
number=danxiang();
print2(number);
}
void main()
{
printf("请输入字符串:\n");
//shuchu1();
shuchu2();
//shuchu3();
putchar('\n');
}
//程序说明
/* creat和input函数是双向链表的输入函数;shuchu1\shuchu2\shuchu3是三个控制输出的函数,每次运行程序只能用一个shuchu函数来实现,
(也就是说可以用creat和print、input和print、danxiang和print2分别搭配使用,运行时在main函数中需注释掉两个shuchu才能实现输出)
剩下的两个函数分别是控制输出的。 */