1、单链表逆序(考频:5次)——不用输入就在函数内生成
函数内生成数据如下:
Head=malloc(sizeof(struct LNode));
Head->next=NULL;
For(i=5;i>=0;i--)
{
P=malloc(sizeof(struct LNode));
P->val=i;
P->next=head->next;
Head->next=p;//头插法建立数据
}
#include <stdio.h>
#include<malloc.h>
struct LNode
{
int val;
struct LNode *next;
}LNode[5]={{1,NULL},{2,NULL},{3,NULL},{4,NULL},{5,NULL}};
//建立单链表
void reverse(struct LNode *Head)
{
struct LNode *p,*q;
p=Head->next;
Head->next=NULL;
while(p)//注意这里,重点在这里!
{
q=p->next;
p->next=Head->next;
Head->next=p;
p=q;
}
p=Head->next;
while(p)
{
printf("%-4d",p->val);
p=p->next;
}
printf("\n");
}
void main()
{
int i,e,n;
struct LNode *p,*Head,*q;
Head=(struct LNode *)malloc(sizeof(struct LNode));
p=Head;
printf("输入建立单链表所需的整数个数:");
scanf("%d",&n);
printf("输入%d个数据,以回车键隔开:\n",n);
for(i=0;i<n;i++)
{
q=(struct LNode *)malloc(sizeof(struct LNode));
scanf("%d",&e);
q->val=e;
p->next=q;
p=q;
}
p->next=NULL;//至关重要的一步!!!
p=Head->next;
printf("建立单链表的结果如下\n");
while(p)
{
printf("%-4d",p->val);
p=p->next;
}
printf("\n");
/* for(i=0;i<5;i++)
{
printf("%-7d",LNode[i].val);
}
printf("\n");
*/
printf("单链表逆序结果如下:\n");
reverse(Head);
}
2、计算1-x+x^2/2!-x^3/3!+...+x^n/n!,x是单浮点数,n是整数(考频:3次)
#include <stdio.h>
void main()
{
int j,n,flag=-1;
float x,sum1=1,sum2=1,sum=1;
printf("请输入求和用到的x和n,用英文逗号隔开\n");
scanf("%f,%d",&x,&n);
if(n==0)//等于和赋值弄错了!!!
{
printf("求和的值为1.0\n");
return;
}
for(j=1;j<=n;j++)
{
sum1*=x;
sum2*=j;
sum+=flag*(sum1/sum2);
flag=-flag;
}
printf("求和的值=%f\n\n",sum);
}
3、数质因数分解(考频:2次)
#include<stdio.h>
#define N 20
int isPrime(int n)
{
int i=2;
while(n%i!=0)
i++;
if(i==n)
return 1;
else
return 0;
}
void main()
{
int num,i,a[N],j=-1;
printf("请输入需要分解的正整数:\n");
scanf("%d",&num);
printf("%d=",num);
if(num<=0)
{
printf("输入数据错误!请重新输入!\n");
return;
}
while(num>=4)
{
for(i=2;i<=num;i++)
{
if(num%i==0&&isPrime(i))
{
a[++j]=i;
num/=i;
break;
}
}
}
if(num>1)
{
a[++j]=num;
}
for(i=0;i<=j;i++)
{
printf("%d",a[i]);
if(i<j)
printf("*");
}
printf("\n");
}
4、字符串逆序,不申请新的数组空间
#include <stdio.h>
#include <string.h>
#define N 100
void reverse(char str[])
{
int len,i;
char temp;
len=strlen(str);
for(i=0;i<(len/2);i++)//次数这里出错,相当于没有交换
{
temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
// str[i]='\0'; 结束符一直在
}
void main()
{
char str[N],*res;
printf("请输入字符串:\n");
scanf("%s",str);
reverse(str);
printf("逆序的结果如下:\n%s\n",str);
}
5、file1的内容全部复制到file2中,且在file2的每一行都要加上行号,最后返回file1中的字符个数。
#include <stdio.h>
#include <stdlib.h>
/*
void main()
{
FILE *fp1,*fp2;
fp1=fopen("c:\\1.txt","r");//重要,不存在不会创建新文件!!!
if(fp1!=NULL)
printf("成功打开\n");
}
*/
/*
#define MAX 1000
void main()
{
FILE *fp1,*fp2;
char c='\n';
fp1=fopen("1.txt","r");
fp2=fopen("2.txt","w");
while(!feof(fp1))
{
char temp[MAX];
fgets(temp,MAX,fp1);//每次都读到换行符结束,换行符算一位,字符串最后面一定是'\0',有换行符则加在'\0'前面,'\n'==10==换行符
fputs(temp,fp2);
}
fclose(fp1);
fclose(fp2);
}*/
void main()
{
FILE *fp1,*fp2;
char temp;
int counts=0,row=1;
fp1=fopen("file1.txt","r");
fp2=fopen("file2.txt","w+");
while(!feof(fp1))
{
temp=fgetc(fp1);
if(temp!=32&&temp!='\n'&&temp!=EOF)//32代表'',10代表'\n'
{
++counts;
}
if(temp!='\n')
{
fputc(temp,fp2);
}
else
{
fprintf(fp2," 行号为:%d",row++);
fprintf(fp2,"\n");
}
}
fprintf(fp2," 行号为:%d",row);
fclose(fp1);
fclose(fp2);
printf("file1.doc文件中的字符总数为:%d\n",counts);
}
5、分数四则运算
#include<stdio.h>
long gcd(long m,long n)
{
while(n)
{
long t=m%n;
m=n;
n=t;
}
return m;
}
void count(char flag,long up1,long up2,long down1,long down2)
{
long t;
switch(flag)
{
case '+':
up1=up1*down2+up2*down1;
down1=down1*down2;
break;
case '-':
up1=up1*down2-up2*down1;
down1=down1*down2;
break;
case '*':
up1=up1*up2;
down1=down1*down2;
break;
case '/':
up1=up1*down2;
down2=down1*up2;
break;
}
t=gcd(up1,down1);
if(up1==down1)
printf("1\n");
else
printf("%d/%d\n",up1/t,down1/t);
}
int main()
{
long up1,up2,down1,down2;
char flag;
printf("请输入两个正分数\n");
while(~scanf("%ld/%ld%c%ld/%ld",&up1,&down1,&flag,&up2,&down2))
{
count(flag,up1,up2,down1,down2);
}
return 0;
}
7、编写一个函数,使之能完成以下功能:利用递归方法找出一个数组中的最大值和最小值,要求递归调用函数的格式如下:
MinMaxValue(arr,n,&max,&min),其中arr是给定的数组,n是数组的个数,max、min分别是最大值和最小值。
#include "stdio.h"
#define N 10
void MinMaxValue(int arr[],int n,int *max,int *min)
{
if(n>=0)
{
if(*max<arr[n])
*max=arr[n];
if(*min>arr[n])
*min=arr[n];
MinMaxValue(arr,n-1,max,min);
}
}
int main()
{
int max=-32768,min=32767;
int a[]={1,54,23,65,87,12,54,87,98,233};
MinMaxValue(a,N-1,&max,&min);
printf("Max=%d,Min=%d\n",max,min);
return 0;
}
8、编写一个完整的程序,使之能完成以下功能:一段名为file.c的程序,该程序中含有括号,现要检查程序中的括号是否配对,提示:利用堆栈实现。(15分)
#include <stdio.h>
#define Stack char
#define Max 999
int judge(char p[])
{
int len=strlen(p);
int top=-1,i;
Stack s[Max];
for(i=0;i<len;i++)
{
switch(p[i])
{
case '(':
case '[':
case '{':
s[++top]=p[i];//只要是左括号就放进去
break;
case ')':
if(s[top]=='(')
top--;
else return 0;
break;
case ']':
if(s[top]=='[')
top--;
else return 0;
break;
case '}':
if(s[top]=='{')
top--;
else return 0;
break;
}
}
if(top==-1)
return 1;
else
return 0;
}
void main()
{
char p[Max];
FILE * fin;
if(!(fin=fopen("file.txt","r")))
printf("failed");
while(!feof(fin))
{
fscanf(fin,"%s",p);
}
printf("%d\n",judge(p));
fclose(fin);
}
9、统计字符串中的数字字符次数,字符串仅由数字字符构成
#include<stdio.h>
void main()
{
char temp[50];
char *str;
int i,counts[10]={0};
printf("请输入长度不超过50的字符串(只含有数字字符):\n");
str=temp;
scanf("%s",str);
for(i=0;i<50;i++)
{
counts[str[i]-'0']++;
}
for(i=0;i<10;i++)
printf("数字%d出现的次数--------%d\n",i,counts[i]);
}
10、利用结构数组和指向结构的指针,输出学生最低、最高成绩以及相应的学号(若有相同的分数,要输出多个学号)
#include <stdio.h>
#define N 10
struct student
{
int num;
int score;
}student_info[100],*pS;
void main()
{
int i,max,min;
printf("请输入学生学号和成绩,以逗号进行隔开\n");
for(i=0;i<N;i++)
{
scanf("%d,%d",&(student_info[i].num),&(student_info[i].score));
}
max=min=student_info[0].score;
pS=student_info+1;
for(i=1;i<N;i++,++pS)
{
if(pS->score>max)
max=pS->score;
if(pS->score<min)
min=pS->score;
}
//printf("最高分为%d,最低分为%d\n",max,min);
pS=student_info;
for(i=0;i<N;i++,++pS)
{
if(pS->score==max)//又把等号弄错了
printf("最高分为%d,学号为%d\n",pS->score,pS->num);
}
pS=student_info;
for(i=0;i<N;i++,++pS)
{
if(pS->score==min)
printf("最低分为%d,学号为%d\n",pS->score,pS->num);
}
}
11、删除输入的字符串中的大小写字母和数字,并统计有重复的字符及其重复次数
#include <stdio.h>
#include <string.h>
struct charInfo{
char val;
int count;
}strInfo[100];
int delChar(char * str,char c)
{
int i=0,count=0;
// len=strlen(str);不算结束符
while(str[i]!='\0')
{
if(str[i]==c)
{
memcpy(&str[i],&str[i+1],strlen(&str[i+1])+1);
++count;
}
else
++i;
}
return count;
}
void main()
{
char * str,temp[1000];
int i;
str=temp;
for(i=0;i<10;i++)
{
strInfo[i].val='0'+i;
strInfo[i].count=0;
}
for(i=0;i<26;i++)
{
strInfo[i+10].val='A'+i;
strInfo[i].count=0;
}
for(i=0;i<26;i++)
{
strInfo[i+36].val='a'+i;
strInfo[i].count=0;
}
scanf("%s",str);//str本来就是地址
for(i=0;i<62;i++)
{
strInfo[i].count=delChar(str,strInfo[i].val);
}
printf("\n\nresult=%s\n\n\n",str);
for(i=0;i<62;i++)
{
printf("%c出现次数%d\n",strInfo[i].val,strInfo[i].count);
}
printf("\n\n");
}
12、小括号匹配
#include <stdio.h>
#define MAX 100
typedef int BOOL;//注意这个分号,bool是c++独有的
#define true 1
#define false 0
BOOL IsPair(FILE *fp)
{
char STACK[MAX],temp;
int top=-1;
while(!feof(fp))
{
temp=fgetc(fp);
if(temp=='(')
STACK[++top]=temp;
if(temp==')')
{
if(STACK[top]=='(')
--top;
else
return false;
}
}
if(top==-1)
return true;
else
return false;
}
void main()
{
FILE *fp;
fp=fopen("file.txt","r");
if(IsPair(fp))
printf("配对成功!\n");
else
printf("配对失败!\n");
}
13、身份证生日大小比较
#include <stdio.h>
int cmpBirth(char *st1,char *st2)
{
int i;
for(i=0;i<8;i++)
{
if(*st1&&*st2&&(*st1==*st2))
{
++st1;
++st2;
}
else if(*st1-*st2>0)
return 1;
else
return 0;
}
}
void main()
{
char str1[20],str2[20];
char *st1,*st2;
printf("请输入要进行对比的两个身份证号码,以回车键进行隔开\n");
scanf("%s",str1);
scanf("%s",str2);
if(cmpBirth(str1+6,str2+6))
printf("第二个人年龄更大一些\n");
else
printf("第一个人年龄更大一些\n");
}
简洁版答案
int isbothsame(char str1[19], char str2[19])
{
int low = 6, hight = 13;
while (low<hight && str1[low] == str2[low])low++;
return str1[low] - str2[low];
}
14、移动链表最大结点至尾部
#include <stdio.h>
#include <malloc.h>
struct LNode
{
int data;
struct LNode * next;
};
struct LNode * CreateLinklist()
{
struct LNode *p,*Head,*q;
int n,i;
Head=(struct LNode *)malloc(sizeof(struct LNode));
Head->next=NULL;
printf("请输入链表结点个数\n");
scanf("%d",&n);
q=Head;
printf("输入数据\n");
for(i=0;i<n;i++)
{
p=(struct LNode *)malloc(sizeof(struct LNode));
scanf("%d",&(p->data));
q->next=p;
q=p;
}
q->next=NULL;
printf("输入的链表如下所示\n");
p=Head->next;
while(p)
{
printf("%-4d",p->data);
p=p->next;
}
return Head;
}
void LNodeFind(struct LNode * Linklist)
{
struct LNode *p=Linklist->next,*q,*r;
int max=p->data,counts=0,flag=1;
p=p->next;
while(p)
{
if(p->data>=max)
{
max=p->data;
++counts;
}
p=p->next;
}
while(counts)
{
p=Linklist->next;
q=Linklist;
flag=1;//利用flag控制不再寻找最大值结点
--counts;
while(p)
{
if(p->next==NULL)
{
p->next=r;
p=r;
p->next=NULL;
}
else if(p->data==max&&flag)
{
r=p;
q->next=p->next; flag=0;
}
q=p;
p=p->next;
}
}
}
void LNodeFind_1(struct LNode *Head)//first one out
{
struct LNode *p,*q,*r;
p=q=Head;
while(p->next!=NULL)
{
if(q->next->data<p->next->data)
q=p;
p=p->next;
}
if(q->next!=p)
{
r=q->next;
q->next=r->next;
p->next=r;
p=r;
p->next=NULL;
}
}
void main()
{
struct LNode *Head,*p;
Head=CreateLinklist();
// LNodeFind(Head);
LNodeFind_1(Head);
printf("\n移动后的结果为\n");
p=Head->next;
while(p)
{
printf("%-4d",p->data);
p=p->next;
}
printf("\n");
}
简洁版本//好方法,多学习一下
void movemax(node *L)
{
node *p = L->next, *pre = L, *max = p;
while (p)
{
if (p->data>max->data)max = p;
pre = p;
p = p->next;
}
int temp = pre->data;
pre->data = max->data;
max->data = temp;//交换结点的数值就可以了,没必要交换结点
}
15、编写一个函数,把整数序列分成两个部分,使得左边部分都不大于右边部分,不需要排序。 ( 考察的是快速排序的部分)
#include <stdio.h>
void partition(int A[],int n)
{
int pivot=A[0];
int low=0,high=n-1;
while(low!=high)
{
while(low<high&&A[high]>=pivot)
--high;
A[low]=A[high];
while(low<high&&A[low]<=pivot)
++low;
A[high]=A[low];
}
A[low]=pivot;
}
void main()
{
int i,A[5]={10,1,9,7,8};
partition(A,5);
for(i=0;i<5;i++)
printf("%-4d",A[i]);
printf("\n");
}
16编写一个函数,删除链表中的最小值。(结点node由整型data和节点指针next构成)
void delmin(node *L)
{
node *p=L->next, *pre=L;
node *min=p, *minpre=L;
while(p)
{
if(p->data < min->data)
{
min = p;
minpre = pre;
}
pre = p;
p = p->next;
}
minpre->next = min->next;
free(min);
}
17、有两个整数数组A和B,它们分别有m、n个整数。并且都是按非递减序列,现将B数组插入A数组中,使得A数组中各元素不大于B数组中各元素,且还是非递减序列。
#include <stdio.h>
int ArrayOrder(int a[],int b[],int m,int n)
{
int i,j;
for(i=0;i<m&&i<n;i++)
{
if(a[i]>b[i])
{
a[i]=b[i];
}
}
if(m<n)
{
for(i=m;i<n;i++)
a[i]=b[i];
}
return m<n?n:m;
}
void main()
{
int a[30],b[30];
int i,m,n,len;
printf("请输入两个数组分别的个数,以空格隔开\n");
scanf("%d %d",&m,&n);
printf("第一个数组输入:\n");
for(i = 0;i < m;i ++)
scanf("%d",&a[i]);
printf("第二个数组输入:\n");
for(i = 0;i < n;i ++)
scanf("%d",&b[i]);
len=ArrayOrder(a,b,m,n);
for(i=0;i<len;i++)
printf("%-4d",a[i]);
printf("\n");
for(i=0;i<n;i++)
printf("%-4d",b[i]);
printf("\n");
}
18、两个递增有序整数数列链表La和Lb,将他们合并后,变成一个新的链表,要求该链表递减排序。(结点node由整型data和节点指针next构成)
#include <stdio.h>
#include <malloc.h>
#define N 5
struct Node{
int data;
struct Node *next;
};
struct Node * CreateLinklist()
{
struct Node *p,*Head,*q;
int i,temp;
Head=(struct Node *)malloc(sizeof(struct Node));
q=Head;
printf("建立单链表,输入%d个数据:\n",N);
for(i=0;i<N;i++)
{
scanf("%d",&temp);
p=(struct Node *)malloc(sizeof(struct Node));
p->data=temp;
q->next=p;
q=p;
}
q->next=NULL;
return Head;
}
struct Node * ReverseLinklist(struct Node * Head)
{
struct Node *p,*q;
p=Head->next;
Head->next=NULL;
while(p)
{
q=p->next;
p->next=Head->next;
Head->next=p;
p=q;
}
return Head;
}
struct Node * MergeList(struct Node *list1,struct Node *list2)
{
struct Node * list3,*r,*la=list1->next,*lb=list2->next;
list3=(struct Node*)malloc(sizeof(struct Node));
r=list3;
if(la->data<=lb->data)
{
r->next=la;
r=la;
la=la->next;
}
else
{
r->next=lb;
r=lb;
lb=lb->next;
}
while(la&&lb)
{
if(la->data<=lb->data)
{
r->next=la;
r=la;
la=la->next;
}
else
{
r->next=lb;
r=lb;
lb=lb->next;
}
}
if(la)
r->next=la;
else
r->next=lb;
free(list1);
free(list2);
return list3;
}
void main()
{
struct Node *h1,*h2,*h3,*p;
h1=CreateLinklist();
h2=CreateLinklist();
h3=MergeList(h1,h2);
p=ReverseLinklist(h3);
p=h3->next;
while(p)
{
printf("%-4d",p->data);
p=p->next;
}
printf("\n");
}
19、对多个字符串进行字典排序
void Sort(char *parr[],int n)
{
int i, j;
char *str1, *str2;
for(i=0; i<n-1; i++)
{
for(j=i+1; j<=n-1; j++)
{
str1=parr[i];
str2=parr[j];
while(*str1 && *str2 && *str1==*str2)str1++,str2++;//重点,*str为字符
if(*str1-*str2>0)
{
char *temp = parr[i];
parr[i] = parr[j];
parr[j] = temp;
}
}
}
}
20、有两字符数组s和t,求t在s中出现第一次的开始位置,如果没有则输出“No”,有则输出开始位置。
int start(char s[],char t[])
{
int s_length = strlen(s);
int i;
char *str1, *str2;
for(i=0; i<s_length; i++)
{
str1 = s+i;
str2 = t;
while(*str1 && *str2 && *str1==*str2)str1++,str2++;
if(*str1-*str2 == *str1)return i;
}
printf("NO!\n");
return -1;
}
21、编程题,将给定字符串例如”aaa111bbb222#”中的数字全部提取出来,放到给定的数组中。字符串以#结尾。函数形式为void int_find(int arr[], char *pc);溢出以-1作为标志。
#include <stdio.h>
void int_find(int arr[],char *pc)
{
char *p=pc;
int i=0;
while(*p!='#')
{
if(*p>='0'&&*p<='9')
arr[i++]=*p-'0';
p++;
}
arr[i]=-1;
}
void main()
{
int Num[100],i=0;
char *str="uestc2015jsj123#";
int_find(Num,str);
while(Num[i]!=-1)
{
printf("%-4d",Num[i]);
i++;
}
printf("\n");
}
22、编程题,随机输入最多100个整数和浮点数,将整数按从大到小排列,浮点数按从小到大排列(浮点数排序可省略),并输出。如:输入10 12.3 12 5 52.1 3.65 88.6 1.0 输出:12 10 5 1.0 3.65 12.3 52.1 88.6。
#include <stdio.h>
void Intsort(int Num[100],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(Num[i]<Num[j])
{
temp=Num[i];
Num[i]=Num[j];
Num[j]=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%-4d",Num[i]);
}
}
void Floatsort(float Num[100],int n)
{
int i,j;
float temp;
for(i=n-1;i>0;i--)
{
for(j=0;j<i;j++)
{
if(Num[j+1]<Num[j])
{
temp=Num[j];
Num[j]=Num[j+1];
Num[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%-7.2f",Num[i]);
}
printf("\n");
}
void main()
{
int NumI[100],n;
float NumF[100],temp;
int i,iNum=0,fNum=0;
printf("要输入的个数\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%f",&temp);
if(temp==(int)temp)
NumI[iNum++]=temp;
else
NumF[fNum++]=temp;
}
Intsort(NumI,iNum);
Floatsort(NumF,fNum);
}
判断整数和浮点数完美方法
#include <string.h>//strstr()
#include <stdlib.h>//atof,atoi
while (m < n) {
scanf("%s", buff);
if (strstr(buff, "."))
fltarr[j++]=atof(buff);
else
intarr[i++] = atoi(buff);
m++;
}
23、编程题,编写完整的程序,构造整数集合,并实现对该集合操作的若干功能:查找集合内的某元素;集合中加入一个新元素;删除集合中某一元素;求两个集合的并集;求两个集合的交集;并给出main函数调用的例子。
注:集合中是不会有重复元素出现的,整数集合其实就是一个整数链表。
typedef struct node {
int data;
node *next;
}node ,*set;
//判断某元素是否在集合内
int isexist(struct node *L, int num)
{
struct node *p = L->next;
while (p)
{
if (p->data == num)return 1;
p = p->next;
}
return 0;
}
//增加一个元素,头插法
void add(struct node *L, int num)
{
if (isexist(L,num)) {
struct node *p = (struct node *)malloc(sizeof(struct node));
p->data = num;
p->next = L->next;
L->next = p;
}
}
//删除集合中某一元素
void del(struct node *a, int num)
{
struct node *p = a->next, *pre = a;
while (p)
{
if (p->data == num)
{
pre->next = p->next;
free(p); break;
}
pre = p;
p = p->next;
}
}
//输出两个集合并集
void intersection(struct node *a, struct node *b)
{
struct node *p = a->next;
int flag = 0;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
struct node *q = b->next;
while (q)
{
p = a->next;
flag = 0;
while (p)
{
if (q->data == p->data)
{
flag = 1;
break;
}
p = p->next;
}
if (!flag)printf("%d ", q->data);
q = q->next;
}
}
//输出两个集合交集
void Union(struct node *a, struct node *b)
{
struct node *p = a->next, *q = b->next;
while (p)
{
q = b->next;
while (q)
{
if (p->data == q->data)
{
printf("%d ", q->data);
break;
}
q = q->next;
}
p = p->next;
}
}
void main()
{
struct node *L = (struct node *)malloc(sizeof(struct node));
struct node *S = (struct node *)malloc(sizeof(struct node));
L->next = 0;
S->next = 0;
int temp;
scanf("%d", &temp);
while (temp != -1)
{
add(L, temp);
scanf("%d", &temp);
}
scanf("%d", &temp);
while (temp != -1)
{
add(S, temp);
scanf("%d", &temp);
}
printf("\n并集:");
intersection(L, S);
printf("\n交集:");
Union(L, S);
}
请教电子科大的资料看不见哇?