数据结构
第一题
1、非递归算法计算二叉树先序的第k个节点
思路:
- 直接套二叉树先序非递归遍历的算法,先不断访问左子树,入栈,如果为空,出栈,然后访问右子树
代码
typedef struct tnode{
int data;
struct tnode *left, *right;
}*tree;
tnode *preorder(tree root,int k){
//利用前序的非递归遍历
tree stack[maxsize];
int top = -1,count=0;
tnode *p = root;
while(p || top != -1){ //栈非空时或者p节点不为空
if(p!=NULL){ //当前节点不为空,访问并不断入栈,转为左子树继续访问
count++;
if(count==k){
break;
}
stack[++top] = p;
p = p->left;
}
else{ //当前节点为空,出栈转为右子树继续访问
p = stack[top--];
p = p->right;
}
}
printf("%d", p->data);
return p;
}
第二题
2、中缀转后缀表达式的算法
思路
按照要求模拟即可,主要是别忘了,在遇到运算符时,除了出在当前栈中,栈顶元素优先级较高的元素之外,还要将当前的运算符入栈
1、整体的规则,遇到字符直接输出
2、遇到左括号直接入栈
3、遇到右括号,直接出栈,直到出栈元素为左括号
4、遇到 ‘’ ‘/’ 将栈顶中符号为’’ ‘/‘出栈,直到为空,或者遇到括号,然后将当前操作符入栈
5、遇到’+’,‘-‘将栈顶中符号为 ‘+’,’-’,‘*’ ‘/’ 全部出栈 ,然后将当前操作符入栈
6、最后栈不为空,输出所有元素
代码:
char *InToPost(char *s){
int n = strlen(s),top=-1,i=0,j=0;
char stack[maxsize];
char *ans = (char *)malloc(sizeof(char)*n);
while(s[i]!='\0'){
if((s[i]>'a' && s[i] < 'z') || (s[i]>'A' && s[i] < 'Z')){ //1、如果是字符 ,直接输出
ans[j++] = s[i];
i++;
}
else if(s[i]=='('){ //2、如果是左括号,直接入栈
stack[++top] = s[i++];
}
else if(s[i]==')'){ //3、如果是右括号,出栈
while(stack[top]!='('){
ans[j++] = stack[top--];
}
top--; //将'('出栈
i++;
}
else if(s[i] == '*' || s[i]=='/'){ //4、如果是乘法,或者除法
while(top!=-1 &&( stack[top]=='*' || stack[top] == '/')){
ans[j++] = stack[top--];
}
stack[++top] = s[i++]; //将当前操作符,入栈
}
else{ //5、如果是减法、加法
while(top!=-1 && stack[top]!='('){
ans[j++] = stack[top--];
}
stack[++top] = s[i++]; //将当前操作符,入栈
}
}
while(top!=-1){ //6、输出栈中剩余元素
ans[j++] = stack[top--];
}
return ans;
}
高级程序语言
第一题
3、一个二维数组,每一行存放一个字符串,比较字符串并排序
思路: 使用strcmp函数以及strcpy函数完成字符串的交换与比较
代码:
void exchange(char a[][maxsize], int n){ //n为字符串个数
int i,j;
char *temp = (char *)malloc(sizeof(char)*maxsize);
for(i=0; i < n-1; i++){ //冒泡排序
for(j=0; j < n-i-1; j++){
if(strcmp(a[j],a[j+1])>0){ //递增排序
strcpy(temp,a[j]); //交换值
strcpy(a[j],a[j+1]);
strcpy(a[j+1],temp);
}
}
}
}
第二题
4、一行n个框,三个颜色,每个相邻的框颜色不能相同,用递归写出有多少种方法
思路: 没啥好说的,就是直接模拟,不过刚开始没想到
int color(int n){
if(n==1) return 3;
return color(n-1)*2;
}
第三题
5、定义结构体,链表输入学生数据,再输入到文件中
typedef struct student{
char name[20];
char ID[20];
int sex; //1为男,0为女
int age;
struct student *next;
}*slist;
slist built_list(slist head,int n){
struct student *q;
struct student *p;
head = (struct student*)malloc(sizeof(struct student));
scanf("%s %s %d %d",head->name,head->ID,&head->sex,&head->age);
n--;
head->next = NULL;
q = head;
while(n > 0){ //尾插法建立单链表
p = (slist)malloc(sizeof(struct student));
scanf("%s%s%d%d",p->name,p->ID,&p->sex,&p->age);
p->next = q->next;
q->next = p;
q = p;
n--;
}
return head;
}
void save(slist head){
FILE *fp;
student *p = head;
fp = fopen("student.txt", "w");
if(fp == NULL){
printf("OPEN FILES FAIL");
return;
}
while(p!=NULL){
fprintf(fp,"%s %s %d %d ",p->name,p->ID,p->sex,p->age);
p = p->next;
}
fclose(fp);
}
6、将该链表按性别拆分成两个链表并排序,在写到两个文件中
思路:
主要是链表的排序没怎么掌握好,这里使用链表的冒泡排序,使用三个指针比较简单易懂。
还有一个是链表的拆分,可以先申请两个带头结点的指针进行操作,这样比较容易进行操作
排序算法:
slist sort_list(slist head){//采用带头结点的链表进行冒泡排序
struct student *pre,*p,*q;
struct student *tail = NULL; //尾指针,每次冒泡排序之后,最后一个元素都已经确定顺序
while(head->next!= tail){ //冒泡次数
pre = head;
p = head->next;
q = p->next;
while(p->next!=tail){ //冒泡长度
if(p->age > q->age){ //如果前一个数比后一个数大,交换指针
pre->next = q;
p->next = q->next;
q->next = p;
}
else{
p = p->next; //不用交换指针,继续往下找
}
pre = pre->next; //q指针已经在上面的if和else中移动了,无需再移动
q = p->next;
}
tail = p; //经过一次冒泡,当前最后一个元素已经排好序,tail前移
}
return head->next; //返回不带头结点的链表,方便后序写入文件中
}
拆分链表以及写入文件
void div_write(slist head){
slist woman=(slist)malloc(sizeof(struct student));
slist man=(slist)malloc(sizeof(struct student));
struct student *w=woman,*m=man,*p=head; //工作指针
while(p!=NULL){
if(p->sex == 1){
m->next = p;
m = p;
}
if(p->sex == 0){
w->next = p;
w = p;
}
p = p->next;
}
w->next = NULL; m->next = NULL;
woman = sort_list(woman);
man = sort_list(man);
FILE *fw, *fm;
fw = fopen("woman.txt","w");
fm = fopen("man.txt","w");
if(fw==NULL && fm == NULL){
printf("OPEN FILES FAIL");
return;
}
while(woman!=NULL){
fprintf(fw," %s %s %d %d ",woman->name,woman->ID,woman->sex,woman->age);
woman = woman->next;
}
while(man!=NULL){
fprintf(fm," %s %s %d %d ",man->name,man->ID,man->sex,man->age);
man = man->next;
}
fclose(fw);
fclose(fm);
}