1.题目:创建单链表并赋值,要求遍历能输出1~9
#include<stdio.h>
#include<stdlib.h>
#define malloc_error -1
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}Node;
typedef Node *PNode;
int Create_Head(PNode *head,ElemType data)
{
PNode p = (PNode)malloc(sizeof(Node)/sizeof(char));
if(p==NULL)
return malloc_error;
p->data=data;
p->next=*head;
*head=p;
}
void DisPlay(PNode head)
{
if (head == NULL)
{
return;
}
PNode temp = head;
while (temp)
{
printf ("%4d", temp->data);
temp = temp->next;
}
printf ("\n");
}
int main()
{
PNode head = NULL;
int i ;
for (i = 9; i > 0; i--)
{
Create_Head(&head, i);
}
DisPlay(head);
return 0;
}
2.题目:读取一个5*5数组,然后显示每行的和与每列的和
#include <stdio.h>
int main()
{
int a[5][5] = {0};
int i;
int j;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
scanf("%d", &a[i][j]);
}
}
printf("\n");
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
printf ("%3d",a[i][j]);
}
printf ("\n");
}
printf ("\n");
for (i = 0; i < 5; i++)
{
int hangs = 0;
for (j = 0; j < 5; j++)
{
hangs = hangs + a[i][j];
}
printf ("第%d行的和为:%d\n",i+1,hangs);
}
printf ("\n");
for (i = 0; i < 5; i++)
{
int lies = 0;
for (j = 0; j < 5; j++)
{
lies = lies + a[j][i];
}
printf ("第%d列的和为:%d\n",i+1,lies);
}
return 0;
}
3.题目:编程判断字符串是否为回文
判断一个字符串是否是回文,例如单词‘level’
#include <stdio.h>
#include <string.h>
#define YES 1
#define NO 0
int judge(char* str)
{
if(str == NULL)
{
return NO;
}
int len = strlen(str);
char* p = str;
char* q = str;
while(*p++);
p -= 2;
for(; str != '\0', p != q; str++, p--)
{
if(*str != *p)
{
return NO;
}
}
return YES;
}
int main()
{
char str1[] = "12321";
char str2[] = "12345";
if(judge(str1))
{
printf("12321是回文\n");
}
else
{
printf("12321不是回文\n");
}
if(judge(str2))
{
printf("12345是回文\n");
}
else
{
printf("12345不是回文\n");
}
return 0;
}
4.题目:生日蜡烛
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的? (第七届蓝桥杯B组真题(第二题))
/*
i + (i + 1) + (i + 2) +...+(i + n) =236
(n + 1)*i +n*(n+1)/2 =236
2*(n+1)*i + n*(n+1) =472
(2*i+n)*(n+1) = 472
*/
#include<stdio.h>
int main()
{
int i;
int n;
int sum = 236;
for (i = 0; i < 100; i++)
{
for (n = 0; n < 100; n++)
{
if ((n + 1) * (2 * i + n) == 472)
{
printf("%d\n",i);
}
}
}
return 0;
}
5.题目:编程实现查找两个字符串的最大公共子串
示例:”aocdfe”和”pmcdfa”最大公共子串为”cfd”
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define GREATER 1
#define EQUAL 0
#define LESS -1
char* my_strstr(char* str1, char* str2)
{
const char* bp;
const char* sp;
if(str1 == NULL || str2 == NULL)
{
return str1;
}
while(*str1)
{
bp = str1; //用于str1的遍历
sp = str2; //用于str2的遍历
while(*bp++ == *sp++) //遍历str2字符串
{
if(*sp == '\0') //找到了str2字符串结束符退出
{
return str1;
}
}
str1++;
}
return NULL;
}
char* mycomstring(char* str1, char* str2)
{
if(str1 == NULL || str2 == NULL)
{
return str1;
}
char* shortstr;
char* longstr;
char* substr;
int i, j;
if(strlen(str1) <= strlen(str2))
{
shortstr = str1;
longstr = str2;
}
else
{
shortstr = str2;
longstr = str1;
}
if(my_strstr(longstr, shortstr) != NULL)
{
return shortstr;
}
substr = (char*)malloc(sizeof(char)*(strlen(shortstr) + 1));
for(i = strlen(shortstr)-1; i>0; i--)
{
for(j = 0; j <= strlen(shortstr)-i; j++)
{
memcpy(substr, &shortstr[j], i);
substr[i] = '\0';
if(my_strstr(longstr, substr) != NULL)
{
return substr;
}
}
}
return NULL;
}
int main()
{
char str1[] = "aocdfe";
char str2[] = "pmcdfa";
printf("%s\n", mycomstring(str1, str2));
return 0;
}
补充:
编程实现字符串中子串的查找
请写一个函数,实现从一个字符串中,查找另一个字符串的位置,如strstr(”12345”, “34”)返回值为2,即在2号位置找到字符串“34”
#include <stdio.h>
const char* my_strstr(const char* str1, const char* str2)
{
const char* bp;
const char* sp;
if(str1 == NULL || str2 == NULL)
{
return str1;
}
while(*str1)
{
bp = str1; //用于str1的遍历
sp = str2; //用于str2的遍历
while(*bp++ == *sp++) //遍历str2字符串
{
if(*sp == '\0') //找到了str2字符串结束符退出
{
return str1;
}
}
str1++;
}
}
int main()
{
char p[] = "12345";
char q[] = "34";
char* r = my_strstr(p, q);
printf("r:%s\n", r);
return 0;
}