本文目录一览:
- c语言编程 数据结构题
- C语言结构体题
- 10道经典的C语言例题(含参考程序)
c语言编程 数据结构题
#include stdio.h
#include stdlib.h
#include conio.h
#define elemType int /* 单链表元素数据类型 */
#define LNODE_SIZE sizeof (struct lNode) /* 单链表结点空间大小 */
#define status int /* 状态型变量 */
#define OVERFLOW -1 /* 内存溢出状态码 */
#define ERROR 0 /* 错误状态码 */
#define OK 1 /* 正确状态码 */
/* 单链表数据结构 */
typedef struct lNode {
elemType data;
struct lNode *next;
} lNode, *linkList;
/* 初始化 */
/* 操作结果:构造一个空的单链表L */
void initList (linkList *L) {
*L = (linkList) malloc (LNODE_SIZE); /* 产生头结点,并使L指向此头结点 */
if(!*L) /* 内存分配失败 */
exit (OVERFLOW);
(*L)->next = NULL; /* 指针域为空 */
}
/* 销毁 */
/* 初始条件:单链表L已存在。操作结果:销毁单链表L */
void destroyList (linkList L) {
linkList p, q;
p = L->next; /* p指向第一个结点 */
while (p) { /* 没到表尾 */
q = p->next;
free (p);
p = q;
}
free (L);
}
/* 判断单链表是否为空 */
/* 初始条件:单链表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
int listIsEmpty (linkList L) {
return L->next == NULL;
}
/* 寻找指定特征(compare)元素的位序 */
/* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
/* 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序 */
/* 若这样的数据元素不存在,则返回值为0 */
int locateElem (linkList L, elemType e, status(*compare)(elemType, elemType)) {
int i = 0;
linkList p = L->next;
while (p) {
i++;
if (compare(p->data, e)) /* 找到这样的数据元素 */
return i;
p = p->next;
}
return 0;
}
/* 数据元素判定 */
/* 满足为1,否则为0 */
int compare (elemType des, elemType src) {
return des == src;
}
/* 单链表指定位置插入新元素 */
/* 操作结果:在带头结点的单链表L中第i个位置之前插入元素e */
status listInsertNode (linkList L, int i, elemType e) {
int j = 0;
linkList p = L, s;
while (p && j < i - 1) { /* 寻找第i-1个结点 */
p = p->next;
j++;
}
if (!p || j < i - 1) /* 插入位置不合理:i小于1或者大于表长 */
return ERROR;
/* 生成新结点,并插入L中 */
s = (linkList) malloc (LNODE_SIZE);
if(!s) /* 内存分配失败 */
exit (OVERFLOW);
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
/* 删除单链表指定位置元素 */
/* 操作结果:在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
status listDeleteNode (linkList L, int i, elemType *e) {
int j = 0;
linkList p = L, q;
while (p->next && j < i - 1) { /* 寻找第i个结点,并令p指向其前驱结点 */
p = p->next;
j++;
}
if (!p->next || j < i - 1) /* 删除位置不合理:i小于1或者大于表长 */
return ERROR;
/* 删除并释放结点 */
q = p->next;
p->next = q->next;
*e = q->data;
free (q);
return OK;
}
/* 打印链表内容 */
/* 初始条件:单链表L已存在。操作结果:当链表不为空时,打印链表内容并返回OK,否则返回ERROR */
status printList (linkList L) {
linkList p = L->next; /* p指向第一个结点 */
if (listIsEmpty (L)) {
puts ("The link list is empty! ");
return ERROR;
}
while (p) {
printf ("%d\t", p->data);
p = p->next;
}
putchar ('\n');
return OK;
}
int main (void) {
linkList L;
elemType e;
int index;
/* 初始化链表 */
initList (L);
/* 插入若干元素 */
listInsertNode (L, 1, 1);
listInsertNode (L, 2, 4);
listInsertNode (L, 3, 6);
listInsertNode (L, 4, 7);
listInsertNode (L, 5, 10);
printf ("初始链表内容:\n");
printList (L);
putchar ('\n');
/* 寻找数据为6的结点位置 */
index = locateElem (L, 6, compare);
printf ("数据为6的结点位置:\n%d\n", index);
putchar ('\n');
/* 在数据为6的结点之前插入数据为5的结点 */
listInsertNode (L, index, 5);
printf ("当前链表内容:\n");
printList (L);
destroyList (L);
getch (); /* 屏幕暂留 */
return 0;
}
C语言结构体题
#include stdio.h
#define N 5
void input_stu(struct Stu *stu);
void output_avg(struct Stu *stu);
struct Stu {
int id;
char name[10];
int sex;
float math;
float eng;
float c;
};
int main() {
struct Stu stu[N];
input_stu(stu);
output_avg(stu);
return 0;
}
void input_stu(struct Stu *stu) {
int i = 1;
do {
printf("请输入第%d个学生的姓名 学号 性别 数学成绩 英语成绩 C语言成绩:", i);
struct Stu *s = stu + i - 1;
scanf("%s %d %d %f %f %f", s->name, &s->id, &s->sex, &s->math, &s->eng, &s->c);
i++;
} while (i <= N);
}
void output_avg(struct Stu *stu) {
int i = 1;
printf("%-8s%-8s%-8s%-8s%-8s%-8s%-8s","学 号", "姓 名", "性 别", "高 数", "英 语", "C", "平均分");
struct Stu *s = stu + i - 1;
float math_avg = stu->math, eng_avg = stu->eng, c_avg = stu->c;
putchar(10);
do {
struct Stu *s = stu + i - 1;
math_avg = ((i - 1)*math_avg + s->math) / i;
eng_avg = ((i - 1) * eng_avg + s->eng) / i;
c_avg = ((i - 1)*c_avg + s->c) / i;
printf("%-8d%-8s%-8s%-8.1f%-8.1f%-8.1f%-8.1f",
s->id, s->name, s->sex == 1 ? "男" : "女", s->math, s->eng, s->c, (s->math + s->eng + s->c) / 3);
putchar(10);
i++;
} while (i <= N);
printf("%-12s%-12s%-12s%", "数学平均分", "英语平均分", "C平均分");
putchar(10);
printf("%-12.1f%-12.1f%-12.1f", math_avg, eng_avg, c_avg);
}
10道经典的C语言例题(含参考程序)
- 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153是一个“水仙花数”,因为153=1^3+5^3+3^3。
#include stdio.h
#include math.h
int main() {
int bai_wei, shi_wei, ge_wei, i, sum = 0;
for(i = 100; i < 1000; i++) {
bai_wei = i / 100;
shi_wei = (i % 100) / 10;
ge_wei = i % 10;
if(i == pow(bai_wei, 3) + pow(shi_wei, 3) + pow(ge_wei, 3)) {
printf("%d ", i);
sum++;
if(sum % 5 == 0)
printf(" ");
}
}
printf(" ");
return 0;
}
- 请输入任意两个整数x和y,求其最大公约数和最小公倍数。
#include stdio.h
int main() {
int x, y, min, max, i;
printf("请输入任意两个整数:");
scanf("%d%d", &x, &y);
min = x < y ? y : x;
max = x > y ? x : y;
for(i = min; i > 0; i--)
if(x % i == 0 && y % i == 0) {
printf("这两个整数的最大公约数为:%d ", i);
break;
}
for(i = max; i <= x * y; i++)
if(i % x == 0 && i % y == 0) {
printf("这两个整数的最小公倍数为:%d ", i);
break;
}
return 0;
}
- 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
#include stdio.h
#include string.h
#include math.h
#define N 50
int main() {
int sum1 = 0, sum2 = 0, sum3 = 0, sum4, i = 0;
char str[N];
printf("请输入一串字符串:");
scanf("%s", str);
for(i = 0; i < strlen(str); i++) {
if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
sum1++;
if(str[i] == ' ')
sum2++;
if(str[i] >= '0' && str[i] <= '9')
sum3++;
}
sum4 = strlen(str) - sum1 - sum2 - sum3;
printf("英文字母的个数:%d ", sum1);
printf("空格的个数:%d ", sum2);
printf("数字的个数:%d ", sum3);
printf("其他符号的个数:%d ", sum4);
return 0;
}
- 求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
#include stdio.h
#include math.h
int main() {
int a, n, s = 0, i, x = 0, y = 0;
printf("请输入整数a的值:");
scanf("%d", &a);
printf("请输入相加的个数n:");
scanf("%d", &n);
for(i = 0; i < n; i++) {
x = y + 2 * pow(10, i);
y = x;
s = s + x;
}
printf("s=%d ", s);
return 0;
}
- 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。编程找出1000以内的所有完数。
#include stdio.h
int main() {
int sum = 0, i, j;
printf("在1000以内的完数有:");
for(i = 2; i <= 1000; i++) {
for(j = 1; j < i; j++)
if(i % j == 0)
sum = sum + j;
if(sum == i)
printf("%d ", i);
sum = 0;
}
printf(" ");
return 0;
}
- 输入一个不多于5位的正整数,要求:1、求它是几位数;2、逆序打印出个位数字。
#include stdio.h
int pows(int a, int n) {
int sum = 1, i;
for(i = 0; i < n; i++)
sum = sum * a;
return sum;
}
int main() {
int n, i, k, x;
printf("n=");
scanf("%d", &n);
for(i = 1; i < 6; i++)
if(n / pows(10, i) == 0) {
printf("%d ", i);
k = i;
break;
}
for(i = 0; i < k; i++) {
x = n / pows(10, i) % 10;
printf("%d", x);
}
printf(" ");
return 0;
}
- 输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
#include stdio.h
int main() {
int n, a[5], i = 0;
printf("请输入一个5位数:");
scanf("%d", &n);
while(n != 0) {
a[i] = n % 10;
n = n / 10;
i++;
}
if(a[0] == a[4] && a[1] == a[3])
printf("这个数是回文数 ");
else
printf("这个数不是回文数 ");
return 0;
}
- 利用递归算法,将所输入的5个字符,以相反顺序打印出来。
#include stdio.h
void digui(char a[], int n) {
if(n == 1)
printf("%c", a[0]);
else {
printf("%c", a[n - 1]);
digui(a, n - 1);
}
}
int main() {
char str[5];
printf("请输入5个字符:");
scanf("%s", str);
digui(str, 5);
printf(" ");
return 0;
}
- 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个序列的前20项之和。
#include stdio.h
int main() {
int i, a = 1, b = 1;
float sum = 0.0;
for(i = 1; i <= 20; i++) {
sum = sum + (float)(a + i) / b;
b = a + i;
a = i;
}
printf("sum=%f ", sum);
return 0;
}
- 利用递归算法求5!。
#include stdio.h
int digui(int n) {
if(n == 1)
return 1;
else
return n * digui(n - 1);
}
int main() {
int n, sum;
printf("n:");
scanf("%d", &n);
sum = digui(n);
printf("sum=%d ", sum);
return 0;
}