王道oj作业10-19

10. week3-day9作业

Description
读取一个字符串,字符串可能含有空格,将字符串逆转,原来的字符串与逆转后字符串相同,输出0,原字符串小于逆转后字符串输出-1,大于逆转后字符串输出1。例如输入 hello,逆转后的字符串为 olleh,因为hello 小于 olleh,所以输出-1
注意最后的判断一定要这么写,因为strcmp标准C中并不是返回-1和1,而是负值和正值
int result = strcmp(c, d);
if (result < 0)
{
printf(“%d\n”,-1);
}
else if (result > 0)
{
printf(“%d\n”, 1);
}
else {
printf(“%d\n”, 0);
}
Input
输入一个字符串,例如 hello,当如输入的字符串也可能是 how are you,含有空格的字符串
Output
输出是一个整型数,如果输入的字符串是hello,那么输出的整型数为-1

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>


int main()
{
	char c[100] = { 0 }, d[100] = {0};
	int len,i,j;
	gets(c);
	len = strlen(c) - 1;
	j = len;
	for ( i = 0; i <= len; i++)
	{
		d[j] = c[i];
		j--;
	}
	
	int result = strcmp(c, d);

	if (result < 0)

	{

		printf("%d\n", -1);

	}

	else if (result > 0)

	{

		printf("%d\n", 1);

	}

	else {

		printf("%d\n", 0);

	}
}

11.week4-day10作业

Description
输入一个整型数,存入变量i,通过子函数change把主函数的变量i除2,然后打印i,例如如果输入的为10,打印出5,如果输入的为7,打印出3
Input
一个整型数
Output
对应整型数除2后的商

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void change(int *j)
{
	*j = *j / 2;
	return *j;
}


int main()
{
	int i;
	scanf("%d",&i);
	change(&i);
	printf("%d",i);

}

12.week4-day11作业

Description
输入一个整型数,然后申请对应大小空间内存,然后读取一个字符串,字符串的输入长度小于最初输入的整型数大小,最后输出输入的字符串即可(无需考虑输入的字符串过长,超过了内存大小);
注意下面问题:
char *p;
scanf(“%d”,&n);
p=malloc(n);
scanf(“%c”,&c);//注意在scanf和gets中间使用scanf(“%c”,&c),去除换行
gets§;
Input
一个整型数和一个字符串,例如
10
hello
Output
输出输入的字符串,上面输入的是hello,那么输出hello

int main()
{
	int n;//定义数组的长度
	char* p;

	scanf("%d", &n);

	p = (char*)malloc(n);//动态获取内存空间

	scanf("%c", &p);//注意在scanf和gets中间使用scanf("%c",&c),去除换行

	gets(p);
	puts(p);
}

13.week4-day12作业

Description
假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?为便于读者理解题意,这里举例说明如下:假如有3个台阶,那么总计就有3种走法:第一种为每次上1个台阶,上3次;第二种为先上2个台阶,再上1个台阶;第三种为先上1个台阶,再上2个台阶。输入为n,输出为走到第n个台阶有几种走法
Input
比如输入是3
Output
如果输入是3,走到第3个台阶的走法总计有3种,1,1,1 和 1,2 和2,1,输出为3

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>


int fun(int t)
{
	int total;
	if (t == 1)
	{
		return 1;
	}
	if (t==2)
	{
		return 2;
	}

	total = fun(t - 1) + fun(t - 2);
	return total;
}



int main()
{
	int n;//台阶总数

	scanf("%d",&n);
	fun(n);

	printf("%d", fun(n));
}

14.Description

输入一个学生的学号,姓名,性别,用结构体存储,通过scanf读取后,然后再通过printf打印输出
Input
学号,姓名,性别,例如输入 101 xiongda m
Output
输出和输入的内容一致,如果输入的是101 xiongda m,那么输出也是101 xiongda m

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

struct student
{
	int num;
	char name[100];
	char sex;
};

int main()
{
	struct student s;
	scanf("%d %s %c",&s.num,&s.name,&s.sex);
	printf("%d %s %c", s.num, s.name, s.sex);
}

15.中级-day2作业

Description
使用C++的引用,注意提交时把代码选为C++;在主函数定义字符指针 char *p,然后在子函数内malloc申请空间,通过fgets读取字符串,然后在主函数中进行输出;要求子函数使用C++的引用,注意在C++中从标准输入读取字符串,需要使用fgets(p,100,stdin)
Input
输入一个字符串,例如 I love C language
Output
如果输入的是I love C language,那么输出也是I love C language

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>


void modify(char*& p)
{
	p = (char*)malloc(100);
	fgets(p, 100, stdin);
}

int main()
{
	char* p;
	modify(p);
	puts(p);
	free(p);
	return 0;
}

16.中级day3作业

Description
初始化顺序表(顺序表中元素为整型),里边的元素是1,2,3,然后通过scanf读取一个元素(假如插入的是6),插入到第2个位置,打印输出顺序表,每个元素占3个空格,格式为1 6 2 3,然后scanf读取一个整型数,是删除的位置(假如输入为1),然后输出顺序表 6 2 3,假如输入的位置不合法,输出false字符串。提醒,Language一定要选为C++。
Input
第一次输入插入的元素值,第二次输入删除的位置
Output
假如插入的元素为6,那么输出为
1 6 2 3
假如删除的位置为1,那么输出为
6 2 3

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;//typedef重命名顺序表元素类型


#define Maxsize 50//顺序表的最大长度50
typedef struct {
	ElemType data[Maxsize];//定义了一个类型为ElemType名称为data的数组,数组大小为Maxsize,用来存放顺序表的元素
	int length;//顺序表的当前长度
}sqList;//定义结构体


//打印顺序表
void PrintList(sqList L)
{
	for (int i = 0; i < L.length; i++)
	{
		printf("%3d", L.data[i]);//要求打印到一排
	}
	printf("\n");
}


//插入,给顺序表中增加一个元素,失败返回false,成功返回true
bool ListInsert(sqList& L, int i, ElemType e)//要修改的线性表L,插入位置i,插入的元素e
{
	if (i<1 || i>L.length + 1)
	{
		return false;
	}//插入位置不合法
	if (L.length + 1 > Maxsize)
	{
		return false;
	}//插入元素之后该顺序表的长度大于定义的最大长度则不合法
	for (int j = L.length; j >= i - 1;j--)
	{
		L.data[j] = L.data[j - 1];//元素后移
	}
	L.data[i - 1] = e;//数组下标与实际位置相差1
	L.length++;
	return true;
}

//按位删除,删除顺序表中的第几个元素,失败返回false,成功返回true

bool ListDelete(sqList& L, int i, ElemType& e)//要修改的线性表L,删除位置i,删除的元素用e返回
{
	if (i<1 || i>L.length)
	{
		return false;
	}//删除位置不合法
	if (L.length == 1)
	{
		return false;
	}//当前线性表中无元素
	e = L.data[i - 1];

	for (int j = i - 1; j < L.length - 1;j++)
	{
		L.data[j] = L.data[j + 1];//元素前移
	}

	L.length--;
	return true;
}




int main()
{
	sqList L;//顺序表名称
	ElemType del;//返回删除的元素
	ElemType e;//插入的数据元素
	int i;//记录删除位置


	L.data[0] = 1;
	L.data[1] = 2;
	L.data[2] = 3;//手动给顺序表存放3个元素
	L.length = 3;//顺序表当前长度为3

	scanf("%d", &e);
	scanf("%d", &i);

	ListInsert(L, 2, e);
	PrintList(L);

	del = ListDelete(L, i, del);
	if (del)
	{
		PrintList(L);
	}
	else
	{
		printf("false");
	}

	return 0;
}

17.Description

输入3 4 5 6 7 9999一串整数,9999代表结束,通过头插法新建链表,并输出,通过尾插法新建链表并输出。
注意输出要采用如下代码(因为OJ判题对空格敏感,因此需要用下面的打印代码来做):
//打印链表中每个结点的值
void PrintList(LinkList L)
{
L=L->next;
while(L!=NULL)
{
printf(“%d”,L->data);//打印当前结点数据
L=L->next;//指向下一个结点
if(L!=NULL)
{
printf(" “);
}
}
printf(”\n");
}
Input
3 4 5 6 7 9999,第二行也是3 4 5 6 7 9999,数据需要输入两次
Output
如果输入是3 4 5 6 7 9999,那么输出是7 6 5 4 3,数之间空格隔开,尾插法的输出是3 4 5 6 7

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;//typedef重命名顺序表元素类型


//定义结构体

typedef struct LNode {
	ElemType data;//数据域存放数据,链表元素类型为ElemType,变量名为data
	struct LNode* next;//指针域存放指针,指向下一个节点
}LNode, * LinkList;//struct LNode *=LinkList,强调链表时使用LinkList


//打印链表

void PrintList(LinkList L)

{

	L = L->next;

	while (L != NULL)

	{

		printf("%d", L->data);//打印当前结点数据

		L = L->next;//指向下一个结点

		if (L != NULL)

		{

			printf(" ");

		}

	}

	printf("\n");

}



//头插法创建链表
LinkList List_HeadInsert(LinkList& L)
{
	LNode* s;ElemType x;
	L = (LinkList)malloc(sizeof(LNode));//创建头节点
	L->next = NULL;//创建空链表

	scanf("%d", &x);
	while (x != 9999)
	{
		s = (LNode*)malloc(sizeof(LNode));//创建要插入的节点
		s->data = x;//输入新结点的数据x
		s->next = L->next;
		L->next = s;//头插法插入节点
		scanf("%d", &x);
	}
	return L;
}

//尾插法创建链表
LinkList List_TailInsert(LinkList& L)
{
	ElemType x;//插入的数据

	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;

	LNode* s;//记录插入的节点
	LNode* r = L;//记录表尾指针

	scanf("%d", &x);
	while (x != 9999)
	{
		s = (LNode*)malloc(sizeof(LNode));//创建要插入的节点
		s->data = x;//输入新结点的数据x
		r->next = s;//尾法插入节点
		r = s;
		scanf("%d", &x);
	}
	r->next = NULL;
	return L;
}

int main()
{
	LinkList L1;//链表名称
	LinkList L2;

	List_HeadInsert(L1);
	List_TailInsert(L2);
	PrintList(L1);
	PrintList(L2);

	return 0;
}

18.中级-day5作业

Description
输入3 4 5 6 7 9999一串整数,9999代表结束,通过尾插法新建链表,查找第二个位置的值并输出,在2个位置插入99,输出为 3 99 4 5 6 7,删除第4个位置的值,打印输出为 3 99 4 5 6 7。
输出函数如下:
void PrintList(LinkList L)
{
L = L->next;
while (L != NULL)
{
printf(“%3d”, L->data);//打印当前结点数据
L = L->next;//指向下一个结点
}
printf(“\n”);
}
针对双向链表,有时间的同学自己练习即可,这道题同样也可以用双向链表来实现一遍
Input
输入是3 4 5 6 7 9999
Output
输出是
4
3 99 4 5 6 7
3 99 4 6 7

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;//typedef重命名顺序表元素类型


//定义结构体

typedef struct LNode {
	ElemType data;//数据域存放数据,链表元素类型为ElemType,变量名为data
	struct LNode* next;//指针域存放指针,指向下一个节点
}LNode, * LinkList;//struct LNode *=LinkList,强调链表时使用LinkList


//打印链表
void PrintList(LinkList L)

{

	L = L->next;

	while (L != NULL)

	{

		printf("%3d", L->data);//打印当前结点数据

		L = L->next;//指向下一个结点

	}

	printf("\n");

}


//尾插法创建链表
LinkList List_TailInsert(LinkList& L)
{
	ElemType x;//插入的数据

	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;

	LNode* s;//记录插入的节点
	LNode* r = L;//记录表尾指针

	scanf("%d", &x);
	while (x != 9999)
	{
		s = (LNode*)malloc(sizeof(LNode));//创建要插入的节点
		s->data = x;//输入新结点的数据x
		r->next = s;//尾法插入节点
		r = s;
		scanf("%d", &x);
	}
	r->next = NULL;
	return L;
}

//链表的按序号查找
LNode* GetElem(LinkList L, int i)//因为返回的是节点值强调的是结点,所以函数返回类型为LNode*
{
	int j = 1;//记录位置
	LNode* p = L->next;//遍历链表
	if (i == 0)
	{
		return L;//i=0,返回头节点
	}
	if (i < 1)
	{
		return NULL;//i为负值,返回null
	}
	while (p && j < i)//该链表存在节点并且j<i
	{
		p = p->next;
		j++;
	}
	return p;
}

//插入节点,输入插入的位置以及元素
LinkList ListInsert(LinkList& L, int i, ElemType e) //i为插入位置,e为插入的元素
{
	int j = 1;//记录位置
	LNode* p = L->next;//遍历链表
	LNode* s;//创建新的空间
	s = (LNode*)malloc(sizeof(LNode));
	s->data = e;

	if (i < 1)
	{
		return NULL;//i为负值,返回null
	}
	if (i == 1)
	{
		s->next = p;
		L->next = s;
	}
	else
	{
		while (p && j < i - 1)//该链表存在节点并且j<i
		{
			p = p->next;
			j++;
		}
		s->next = p->next;
		p->next = s;
	}
	return L;
}

//按序号删除节点
LinkList List_LocateDelete(LinkList& L, int i) //i为删除的位置
{
	int j = 1;//记录位置
	LNode* q;//q指向被删除节点
	LNode* p = L->next;//遍历链表

	if (i < 1)
	{
		return NULL;//i为负值,返回null
	}
	if (i == 1)
	{
		q = p;
		L->next = q->next;
		free(q);
	}
	else
	{
		while (j < i - 1)//该链表存在节点并且j<i
		{
			p = p->next;
			j++;
		}
		q = p->next;
		p->next = q->next;
		free(q);

	}
	return L;
}


int main()
{
	LinkList L;//链表名称

	LNode* search;//记录查找的返回值
	ElemType e;//元素
	LNode* del;//记录删除的返回值

	List_TailInsert(L);//3 4 5 6 7 9999//1 3 5 7 9 9999
	
	search=GetElem(L, 2);
	printf("%d\n", search->data);

	search = ListInsert(L,2,99);
	PrintList(L);

	List_LocateDelete(L,4);
	PrintList(L);
	
	return 0;
}

19.中级-day6作业

Description
新建一个栈,读取标准输入3个整数3 4 5,入栈3 4 5,依次出栈,打印 5 4 3,新建循环队列(Maxsize为5),读取标准输入3 4 5 6 7,入队7时,队满,打印false,然后依次出队,输出 3 4 5 6
Input
读取标准输入,内容依次是3 4 5,换行后,接着是3 4 5 6 7
Output
如果输入是3 4 5,换行,接着是3 4 5 6 7,那么输出是
5 4 3
false
3 4 5 6
注意每个数字占用两个字符的位置,5之前是有一个空格的,第三行的3之前也是有一个空格的

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//定义顺序栈的结构体

typedef int Elemtype;
#define Maxsize 5 //最多可以放5个元素
typedef struct {
	Elemtype data[Maxsize];//定义一个数组用来存放栈中元素
	int top;//定义栈顶指针
}Sqstack;


//初始化顺序栈S
void InitSqstack(Sqstack& S)
{
	S.top = -1;
}

//进栈
bool Push(Sqstack& S, Elemtype e)
{
	if (S.top == Maxsize - 1)
	{
		return false;
	}
	else
	{
		S.top = S.top + 1;
		S.data[S.top] = e;
		return true;
	}
}

//出栈
bool Pop(Sqstack & S)
{
	Elemtype x;
	if (S.top == -1)
	{
		return false;
	}
	else
	{
		while (S.top != -1)
		{
			x = S.data[S.top];
			printf("%2d",x);
			S.top--;
		}
	
		return true;
	}
}

//定义队列顺序存储的结构体

typedef struct {
	Elemtype data[Maxsize];//定义一个数组用来存放元素
	int front, rear;//定义队头和队尾指针
}SqQueue;


//初始化循环队列
void InitSqQueue(SqQueue& Q)
{
	Q.front = Q.rear = 0;
}

//判断循环队列满
bool QueueMax(SqQueue Q)
{
	if (Q.front == (Q.rear + 1) % Maxsize)
	{
		return true;
	}
	else
	{
		return false ;
	}
}

//循环队列入队
bool EnQueue(SqQueue& Q, Elemtype e)
{
	if (Q.front == (Q.rear + 1) % Maxsize)//判断循环队列满
	{
		return false;
	}
	else//队列不满入队从队尾入队
	{
		Q.data[Q.rear] = e;
		Q.rear = (Q.rear + 1) % Maxsize;
		return true;
	}
}

//循环队列出队
bool DeQueue(SqQueue& Q)
{
	Elemtype e;
	if (Q.front == Q.rear)//判断循环队列空
	{
		return false;
	}
	else//队列不空入队从队头出队
	{
		while (Q.front != Q.rear)
		{
			e = Q.data[Q.front];
			printf("%2d", e);
			Q.front = (Q.front + 1) % Maxsize;
		}
		
		return true;
	}
}



int main()
{

	Sqstack S;

	SqQueue Q;
	bool flag;//记录队列满
	Elemtype m = 0;

	InitSqstack(S);//初始化栈

	//入栈
	Elemtype a, b, c;//记录进栈元素
	scanf("%d %d %d",&a,&b,&c);
	Push(S, a);
	Push(S, b);
	Push(S, c);
	
	//栈元素出栈
	Pop(S);
	printf("\n");
	InitSqQueue(Q);//初始化队列

	//入队
	Elemtype d, e, f, g, h;//记录进队元素
	scanf("%d %d %d %d %d", &d, &e, &f, &g, &h);
	EnQueue(Q, d);
	EnQueue(Q, e);
	EnQueue(Q, f);
	EnQueue(Q, g);
	EnQueue(Q, h);

	flag = QueueMax(Q);
	if (flag)
	{
		printf("false\n");
	}

	//出队
	DeQueue(Q);


	return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值