2010-04-21 22:17 5702人阅读 评论(0) 收藏 举报

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.         求三角形面积

给出三角形的三个边长为abc,求三角形的面积。

         (注意考虑是不是三角形)

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语言实现)的更多相关文章

  1. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  2. 数据结构基础(1)--数组C语言实现--动态内存分配

    数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数 ...

  3. 撩课-Java每天10道面试题第1天

    1.简述JDK.JRE.JVM? 一.JDK JDK(Java Development Kit) 是整个JAVA的核心, 包括了Java运行环境(Java Runtime Envirnment), 一 ...

  4. Java:关于main方法的10道面试题

    感觉假期过得好快,东西也丢得快. 假期吃喝玩乐之余也来温故一下Java知识,下面给大家整理了10道Java main方法的经典面试题,都来挑战一下自己的Java基础知识吧! 1.main方法是做什么用 ...

  5. 11.10 noip模拟试题

    1.第K小数 (number.cpp/c/pas) [问题描述] 有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数 相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少 ...

  6. 撩课-Java每天10道面试题第6天

    51.HashMap的实现原理 HashMap的主干是一个Entry数组. Entry是HashMap的基本组成单元, 每一个Entry包含一个key-value键值对. HashMap基于hashi ...

  7. 【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码

    问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界 ...

  8. 九度oj题目&amp;吉大考研10年机试题全解

    吉大考研机试2010年题目 题目一(jobdu1478:三角形的边).    http://ac.jobdu.com/problem.php?pid=1478 给出三个正整数,计算最小的数加上次小的数 ...

  9. 每一个JavaScript开发者都应该知道的10道面试题

    JavaScript十分特别.而且差点儿在每一个大型应用中起着至关关键的数据.那么,究竟是什么使JavaScript显得与众不同,意义非凡? 这里有一些问题将帮助你了解其真正的奥妙所在:   1.你能 ...

随机推荐

  1. python常用正则表达式

    匹配特定数字:^[1-9]\d*//匹配正整数−[1−9]\d∗  //匹配负整数^-?[1-9]\d*//匹配整数[1−9]\d∗|0 //匹配非负整数(正整数 + 0)^-[1-9]\d*|0// ...

  2. selenium+firefox时每次都要导入数据解决方法解决方法:

    火狐录制组件:selenium-ide-2.9.0.xpiselenium1调试c#前要运行服务器 selenium-server-standalone-2.47.1.jar导入引用压缩包seleni ...

  3. JavaScript高级程序设计:第十一章

    一.选择符API SelectorsAPILevel 1的核心是两个方法:querySelector()和querySelectorAll(). 1. querySelector()方法 queryS ...

  4. C语言strtok()函数:字符串分割

    头文件:#include <string.h> 定义函数:char * strtok(char *s, const char *delim); 函数说明:strtok()用来将字符串分割成 ...

  5. LeetCode OJ 219.Contains Duplicate 2

    Given an array of integers and an integer k, find out whether there are two distinct indices i and j ...

  6. 第5章 字符串----char与String

    1.java有8种基本数据类型: 数值型:整数类型(byte,short,int,long) :浮点类型(float,double) 字符型:char  布尔型:true,false 2.char:  ...

  7. 2.请尝试安装和配置JDK,并给出安装、配置JDK的步骤。

    win10/64位 1.解压jdk1.8.0_91_x64.rar 2.同时按住win键和pause键,弹出系统属性窗口,选择高级系统设计选项. 3.然后单击环境变量按钮. 4.弹出环境变量对话框后, ...

  8. MVC4相关Razor语法以及Form表单(转载)

    Razor的布局(Layout) 默认建的工程都自带的了一个_ViewStart.cshtml文件,文件里面的代码如下: @{ Layout = "~/Views/Shared/_Layou ...

  9. Cowrie蜜罐部署教程【转载】

    0.蜜罐分类: 低交互:模拟服务和漏洞以便收集信息和恶意软件,但是攻击者无法和该系统进行交互: 中等交互:在一个特有的控制环境中模拟一个生产服务,允许攻击者的部分交互: 高交互:攻击者可以几乎自由的访 ...

  10. Service的启动方式

    Service的启动方式: 两种启动模式,一种是非绑定启动模式,另一种是绑定启动模式. 一.startservice方式启动 Intent intent = new Intent(this, Firs ...