关于数据结构的10个面试题(c语言实现)
1. 输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
A: 递归方法逆序输出,栈方法逆序输出。
(任意实现一种既可)
void PrintListUsingRecursicve(pListNode head)
{
if(head!=NULL)
{
PrintListUsingRecursicve(head->m_pNext);
printf("%d/n",head->m_nKey);
}
}
void PrintListUsingStack(pListNode head)
{
Stack s;
s.top=0;
pListNode p=head;
do{
push(&s,p->m_nKey);
p=p->m_pNext;
}while(p!=NULL);
while(!IsEmpty(&s))
{
printf("%d/n",pop(&s));
}
}
2. 二元树的深度
题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define MAXLEN 100
#define MAXNUM 10
typedef int Tree[MAXLEN];
Tree bt;
int GetDeep(int i)
{
int l=0,r=0;
if(bt[i*2]!=-1)
{
l=GetDeep(i*2)+1;
}
if(bt[i*2+1]!=-1)
{
r= GetDeep(i*2+1)+1;
}
return l>r?l:r;
}
int main()
{
int i=0;
memset(bt,-1,sizeof(bt));
for(i=1;i<=MAXNUM;i++)
bt[i]=i;
bt[(i-1)*2]=i*2;
printf("%d /n",GetDeep(1));
return 0;
}
3. 整数的二进制表示中1的个数
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
(关键是能不能想到后面的那个方法,只要想到这个方法既可)
int Bit1inInt(int i)
{
int result=0;
do{
result+=i&1;
}while(i=i>>1);
return result;
}
4. 从上往下遍历二元树
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
(先序,中序,后序三种方式实现)
如果从上往下,从左到右的话只有一种遍历的方式:广度优先遍历。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define MAXLEN 100
#define MAXNUM 10
typedef int Tree[MAXLEN];
Tree bt;
typedef struct queue
{
int begin,end;
int space[MAXLEN];
}Queue;
int main()
{
int i=0;
memset(bt,-1,sizeof(bt));
for(i=1;i<=MAXNUM;i++)
bt[i]=i;
Queue qe;
qe.begin=0;qe.end =0;
qe.space[qe.end++]=bt[1];
while(qe.begin!=qe.end)
{
if(bt[2*qe.space[qe.begin]]!=-1)//lchild
{
qe.space[qe.end++]=bt[2*qe.space[qe.begin]];
}
if(bt[2*qe.space[qe.begin]+1]!=-1)//rchild
{
qe.space[qe.end++]=bt[2*qe.space[qe.begin]+1];
}
qe.begin++;
}
printf("--------------------/n");
for(i=0;i<qe.end;i++)
printf("%d ",qe.space[i]);
return 0;
}
先序,中序,后序三种方式的只是遍历二元树
typedef int Tree[MAXLEN];
Tree bt;
void PreOrderTraverse(int i)
{
if(bt[i]==-1) {return ;}
printf("%d ",bt[i]);
PreOrderTraverse(i*2);//lchild
PreOrderTraverse(i*2+1);//rchild
}
void InOrderTraverse(int i)
{
if(bt[i]==-1) {return ;}
InOrderTraverse(i*2);//lchild
printf("%d ",bt[i]);
InOrderTraverse(i*2+1);//rchild
}
void PostOrderTraverse(int i)
{
if(bt[i]==-1) {return ;}
PostOrderTraverse(i*2);//lchild
PostOrderTraverse(i*2+1);//rchild
printf("%d ",bt[i]);
}
int main()
{
int i=0;
memset(bt,-1,sizeof(bt));
for(i=1;i<=MAXNUM;i++)
bt[i]=i;
printf("/n---------------/n");
PreOrderTraverse(1);
printf("/n---------------/n");
InOrderTraverse(1);
printf("/n---------------/n");
PostOrderTraverse(1);
return 0;
}
5. 查找链表中倒数第k个结点
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
(最快的方法,只遍历一遍)
int FindCoundDownInList(pListNode head,int num)
{
pListNode p1,p2;
p1=p2=head;
while(num-->0 && p1!=NULL) p1=p1->m_pNext;
if(p1==NULL) return 0;
else{
while(p1!=NULL)
{
p1=p1->m_pNext;
p2=p2->m_pNext;
}
return p2->m_nKey;
}
}
6. 求三角形面积
给出三角形的三个边长为a、b、c,求三角形的面积。
(注意考虑是不是三角形)
double GetArea(int a,int b,int c)
{
if(a-b>=c || a+b<=c)
return -0.1;
else{
double s=0.5*(a+b+c);
double area=sqrt(s*(s-a)*(s-b)*(s-c));
return area;
}
}
7. 压缩字符串
例如字串”aaabbbbccccc”,转换成相邻字符+个数的形式压缩,成为”a3b4c5”。
(如果有10个数相同)
假设需要考虑解压缩
char *MergeString(const char * ch)
{
char *s=(char *)malloc(sizeof(ch));
if(s!=NULL)
{
int len=strlen(ch), i=0,j=0,k=0;
for(;i<len;i=j)
{
int num=0;
while(ch[j]==ch[i]) j++,num++;
s[k++]=ch[i];
sprintf(s+k,"%d",num);
k=strlen(s);
}
}
return s;
}
8. 如何判断一个单向链表是否有环。
int ISCircle(pListNode head)
{
pListNode p1=head;
p1=p1->m_pNext;
while(p1!=NULL)
{
if(p1==head) return 1;
else p1=p1->m_pNext;
}
return 0;
}
9. 判断一个字符串是否对称。
aabbaa , efffe返回true
aabac返回false
int SymmetricString( const char *ch)
{
int len=strlen(ch);
int i=0,j=len-1;
if(len%2!=0) return 0;
for(i=0,j=len-1;i<=len/2;i++,j--)
{
if(ch[i]!=ch[j]) return 0;
}
return 1;
}
10. 判断一个字符串是否是另一个字符串的字串
int next[20];
void get_next(const char* T,int next[])
{
int i=0,j=-1;next[0]=-1;
int len=strlen(T);
while(i<len)
{
if(j==-1||T[i]==T[j]) {++i;++j;next[i]=j;}
else j=next[j];
}
}
int index_KMP(const char * S,const char * T)
{
int i=0,j=0;
get_next(T,next);
int lens=strlen(S),lent=strlen(T);
while(i<lens &&j<lent){
if(j==-1 ||S[i]==T[j]){++i;++j;}
else j=next[j]; }
if(j>=lent) return i-lent;
else return -1;
}
链表的定义,栈的定义:
typedef struct stack
{
int top;
int space[MAXLEN+1];
}Stack;
int push(Stack *s,int num)
{
if(s->top>=sizeof(s->space)/sizeof(int)) return -1;//Error
s->space[s->top++]=num;
return num;
}
int pop(Stack *s)
{
if(s->top<0) return -1;
return s->space[--s->top];
}
int IsEmpty(Stack *s)
{
return s->top==0;
}
typedef struct ListNode
{
int m_nKey;
struct ListNode *m_pNext;
}ListNode,*pListNode;
pListNode CreateList()
{
srand((unsigned long)time(NULL));
pListNode head,p1,p2;
head=(pListNode)malloc(sizeof(ListNode));
p1=head;p2=p1;
int i=MAXLEN;
while(i--){
p2=(pListNode)malloc(sizeof(ListNode));
p2->m_nKey= rand()*rand()%(MAXLEN*rand());
p1->m_pNext=p2;
p1=p2;
}
p2->m_pNext=NULL;
return head;
}
void PrintList(pListNode head)
{
pListNode p=head;
do{
printf("%d/n",p->m_nKey);
p=p->m_pNext;
}while(p!=NULL);
}
关于数据结构的10个面试题(c语言实现)的更多相关文章
- 10个经典的C语言面试基础算法及代码
10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...
- 数据结构基础(1)--数组C语言实现--动态内存分配
数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数 ...
- 撩课-Java每天10道面试题第1天
1.简述JDK.JRE.JVM? 一.JDK JDK(Java Development Kit) 是整个JAVA的核心, 包括了Java运行环境(Java Runtime Envirnment), 一 ...
- Java:关于main方法的10道面试题
感觉假期过得好快,东西也丢得快. 假期吃喝玩乐之余也来温故一下Java知识,下面给大家整理了10道Java main方法的经典面试题,都来挑战一下自己的Java基础知识吧! 1.main方法是做什么用 ...
- 11.10 noip模拟试题
1.第K小数 (number.cpp/c/pas) [问题描述] 有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数 相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少 ...
- 撩课-Java每天10道面试题第6天
51.HashMap的实现原理 HashMap的主干是一个Entry数组. Entry是HashMap的基本组成单元, 每一个Entry包含一个key-value键值对. HashMap基于hashi ...
- 【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码
问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界 ...
- 九度oj题目&吉大考研10年机试题全解
吉大考研机试2010年题目 题目一(jobdu1478:三角形的边). http://ac.jobdu.com/problem.php?pid=1478 给出三个正整数,计算最小的数加上次小的数 ...
- 每一个JavaScript开发者都应该知道的10道面试题
JavaScript十分特别.而且差点儿在每一个大型应用中起着至关关键的数据.那么,究竟是什么使JavaScript显得与众不同,意义非凡? 这里有一些问题将帮助你了解其真正的奥妙所在: 1.你能 ...
随机推荐
- 安装 svn
rpm -qa subversion yum install subversion svnserve --version 创建仓库目录例如: mkdir /home/svn/game 创建项目 svn ...
- Linux-ssh的rsa认证登录配置
首先看一下实验环境: [root@localhost ~]# cat /proc/version #ip 192.168.254.130 Linux version 2.6.32-431.el6.x8 ...
- GitHub这么火,程序员你不学学吗? 超简单入门教程 【转载】
本GitHub教程旨在能够帮助大家快速入门学习使用GitHub. 本文章由做全栈攻城狮-写代码也要读书,爱全栈,更爱生活.原创.如有转载,请注明出处. GitHub是什么? GitHub首先是个分布式 ...
- 前台改变asp button控件的值,后台取值没有改变的问题
前台: <asp:Button ID="btnEdit" Style="margin-left: 600px;" runat="server&q ...
- DLT(Diagnostic Log and Trace)嵌入式系统程序运行记录
http://blog.csdn.net/yanlinembed/article/details/49837975 DLT的使用有属于Application范畴与Context范畴.在使用DLT时,需 ...
- ActiveX控件打包成Cab实现浏览器自动下载安装
前言 我们在浏览器中使用我们自己的一些OCX,或者是DLL这一类的文件,在X86的机器上需要我们手动将这些文件拷贝到Windows/System32 文件夹下面去,然后通过Dos命令regsvr32 ...
- Python 模块功能paramiko SSH 远程执行及远程下载
模块 paramiko paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现 ...
- 打开另外一个App
/** * 打开一个app * * @param packageName * @param data * @return */ public static boolean lanuchApp(Cont ...
- Linux 配置tomcat遇见的若干问题
1.提示catalina.sh缺失 原因:未对bin目录下的.sh文件授权 执行:chmod +x bin/*.sh即可 2.正常启动Tomcat 但是外界无法访问 Linux防火墙原因,进入到 et ...
- Sql server 开窗函数over()的语法
用法一:与ROW_NUMBER()函数结合用,给结果进行排序编号,如图: 代码如下: SELECT ROW_NUMBER() over(order by RequiredDate) num ,* fr ...