C语言 ,嵌入式 ,数据结构 面试题目(3)
生活随笔
收集整理的這篇文章主要介紹了
C语言 ,嵌入式 ,数据结构 面试题目(3)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
182 鏈表題:一個(gè)鏈表的結(jié)點(diǎn)結(jié)構(gòu)
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
(1)已知鏈表的頭結(jié)點(diǎn)head,寫(xiě)一個(gè)函數(shù)把這個(gè)鏈表逆序 ( Intel)
Node * ReverseList(Node *head) //鏈表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}
(2)已知兩個(gè)鏈表head1 和head2 各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序。(保留所有結(jié)點(diǎn),即便大小相同)
Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
Node *p1 = NULL;
Node *p2 = NULL;
if ( head1->data < head2->data )
{
head = head1 ;
p1 = head1->next;
p2 = head2 ;
}
else
{
head = head2 ;
p2 = head2->next ;
p1 = head1 ;
}
Node *pcurrent = head ;
while ( p1 != NULL && p2 != NULL)
{
if ( p1->data <= p2->data )
{
pcurrent->next = p1 ;
pcurrent = p1 ;
p1 = p1->next ;
}
else
{
pcurrent->next = p2 ;
pcurrent = p2 ;
p2 = p2->next ;
}
}
if ( p1 != NULL )
pcurrent->next = p1 ;
if ( p2 != NULL )
pcurrent->next = p2 ;
return head ;
}
(3)已知兩個(gè)鏈表head1 和head2 各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序,這次要求用遞歸方法進(jìn)行。 (Autodesk)
答案:
Node * MergeRecursive(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
if ( head1->data < head2->data )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}
return head ;
}
183.利用鏈表實(shí)現(xiàn)將兩個(gè)有序隊(duì)列A和B合并到有序隊(duì)列H中,不準(zhǔn)增加其他空間。
請(qǐng)?zhí)峁┤稽c(diǎn)的程序
以升序?yàn)槔?#xff1a;
while(a != NULL && b!= NULL)
{
if (a->data < b->data)
{
h->data = a->data;
a = a->next;
}
else if (a->data == b->data)
{
h->data = a->data;
a = a->next;
b = b->next;
}
else
{
h->data = b->data;
b = b->next
}
h = h->next;
}
if (a == NULL)
{
while (b != NULL)
{
h->data = b->data;
h = h->next;
b = b->next;
}
}
else?
{
while(a != NULL)
{
h->data = a->next;
h = h->next;
a = a->next;
}
}
184單向鏈表的反轉(zhuǎn)是一個(gè)經(jīng)常被問(wèn)到的一個(gè)面試題,也是一個(gè)非常基礎(chǔ)的問(wèn)題。比如一個(gè)鏈表是這樣的: 1->2->3->4->5 通過(guò)反轉(zhuǎn)后成為5->4->3->2->1。最容易想到的方法遍歷一遍鏈表,利用一個(gè)輔助指針,存儲(chǔ)遍歷過(guò)程中當(dāng)前指針指向的下一個(gè)元素,然后將當(dāng)前節(jié)點(diǎn)元素的指針?lè)崔D(zhuǎn)后,利用已經(jīng)存儲(chǔ)的指針往后面繼續(xù)遍歷。源代碼如下:
struct linka {
? ? ?int data;
? ? ?linka* next;
};
void reverse(linka*& head)
{
? ? ?if(head ==NULL)
? ? ? ? ? return;
? ? ?linka*pre, *cur, *ne;
? ? ?pre=head;
? ? ?cur=head->next;
? ? ?while(cur)
? ? ?{
? ? ? ? ? ne = cur->next;
? ? ? ? ? cur->next = pre;
? ? ? ? ? pre = cur;
? ? ? ? ? cur = ne;
? ? ?}
? ? ?head->next = NULL;
? ? ?head = pre;
}
還有一種利用遞歸的方法。這種方法的基本思想是在反轉(zhuǎn)當(dāng)前節(jié)點(diǎn)之前先調(diào)用遞歸函數(shù)反轉(zhuǎn)后續(xù)節(jié)點(diǎn)。源代碼如下。不過(guò)這個(gè)方法有一個(gè)缺點(diǎn),就是在反轉(zhuǎn)后的最后一個(gè)結(jié)點(diǎn)會(huì)形成一個(gè)環(huán),所以必須將函數(shù)的返回的節(jié)點(diǎn)的next域置為NULL。因?yàn)橐淖僪ead指針,所以我用了引用。算法的源代碼如下:
linka* reverse(linka* p,linka*& head)
{
? ? ?if(p == NULL || p->next == NULL)
? ? ?{
? ? ? ? ? head=p;
? ? ? ? ? return p;
? ? ?}
? ? ?else
? ? ?{
? ? ? ? ? linka* tmp = reverse(p->next,head);
? ? ? ? ? tmp->next = p;
? ? ? ? ? return p;
? ? ?}
}
185 對(duì)如下雙鏈表
typedef struct _node
{
int iData;
struct _node *pPrev;
struct _node *pNext;
}node;
a.請(qǐng)寫(xiě)出代碼,將node*n插入到node*p后。
b.如果多線程同時(shí)訪問(wèn)此鏈表,需要加鎖,請(qǐng)說(shuō)明以下步驟
(a)申請(qǐng)內(nèi)存給n.
(b)N數(shù)據(jù)初始化。
(c)插入
注意加鎖和解鎖的時(shí)機(jī)。
node* insert(node* p, node* n)
{
if ((p == NULL) || (n == NULL))
{
return NULL;
}
if (p->pNext != NULL)
{
p->pNext->pPrev = n;
}
n->pPrev = p;
n->pNext = p->pNext;
p->pNext = n;
return n;
}
186、試創(chuàng)建二叉數(shù),并寫(xiě)出常見(jiàn)的幾種遍歷方式 ?
#include "stdio.h"
#include "string.h"
#include <stdlib.h>
#define NULL 0
typedef struct BiTNode{
? ? char data;
? ? struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Create(BiTree T){
? ? char ch;
? ? ch=getchar();
? ? if(ch=='0')
T=NULL;
? ? else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
? ? printf("Error!");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
? ? }
? ? return T;
}
void Preorder(BiTree T){
? ? ?if(T){
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}//先序遍歷
void Inorder(BiTree T){
? ? if(T){
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}//中序遍歷
void Postorder(BiTree T){
? ? if(T){
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}//后序遍歷
187、 前序遍歷輸入,如圖所示,寫(xiě)出后序遍歷輸出結(jié)果?
?例如二叉樹(shù):
?
?
輸入序列ABD..EH...CF.I..G..
輸出結(jié)果為:?
答案:
輸出結(jié)果為:DHEBIFGCA
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
(1)已知鏈表的頭結(jié)點(diǎn)head,寫(xiě)一個(gè)函數(shù)把這個(gè)鏈表逆序 ( Intel)
Node * ReverseList(Node *head) //鏈表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}
(2)已知兩個(gè)鏈表head1 和head2 各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序。(保留所有結(jié)點(diǎn),即便大小相同)
Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
Node *p1 = NULL;
Node *p2 = NULL;
if ( head1->data < head2->data )
{
head = head1 ;
p1 = head1->next;
p2 = head2 ;
}
else
{
head = head2 ;
p2 = head2->next ;
p1 = head1 ;
}
Node *pcurrent = head ;
while ( p1 != NULL && p2 != NULL)
{
if ( p1->data <= p2->data )
{
pcurrent->next = p1 ;
pcurrent = p1 ;
p1 = p1->next ;
}
else
{
pcurrent->next = p2 ;
pcurrent = p2 ;
p2 = p2->next ;
}
}
if ( p1 != NULL )
pcurrent->next = p1 ;
if ( p2 != NULL )
pcurrent->next = p2 ;
return head ;
}
(3)已知兩個(gè)鏈表head1 和head2 各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序,這次要求用遞歸方法進(jìn)行。 (Autodesk)
答案:
Node * MergeRecursive(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
if ( head1->data < head2->data )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}
return head ;
}
183.利用鏈表實(shí)現(xiàn)將兩個(gè)有序隊(duì)列A和B合并到有序隊(duì)列H中,不準(zhǔn)增加其他空間。
請(qǐng)?zhí)峁┤稽c(diǎn)的程序
以升序?yàn)槔?#xff1a;
while(a != NULL && b!= NULL)
{
if (a->data < b->data)
{
h->data = a->data;
a = a->next;
}
else if (a->data == b->data)
{
h->data = a->data;
a = a->next;
b = b->next;
}
else
{
h->data = b->data;
b = b->next
}
h = h->next;
}
if (a == NULL)
{
while (b != NULL)
{
h->data = b->data;
h = h->next;
b = b->next;
}
}
else?
{
while(a != NULL)
{
h->data = a->next;
h = h->next;
a = a->next;
}
}
184單向鏈表的反轉(zhuǎn)是一個(gè)經(jīng)常被問(wèn)到的一個(gè)面試題,也是一個(gè)非常基礎(chǔ)的問(wèn)題。比如一個(gè)鏈表是這樣的: 1->2->3->4->5 通過(guò)反轉(zhuǎn)后成為5->4->3->2->1。最容易想到的方法遍歷一遍鏈表,利用一個(gè)輔助指針,存儲(chǔ)遍歷過(guò)程中當(dāng)前指針指向的下一個(gè)元素,然后將當(dāng)前節(jié)點(diǎn)元素的指針?lè)崔D(zhuǎn)后,利用已經(jīng)存儲(chǔ)的指針往后面繼續(xù)遍歷。源代碼如下:
struct linka {
? ? ?int data;
? ? ?linka* next;
};
void reverse(linka*& head)
{
? ? ?if(head ==NULL)
? ? ? ? ? return;
? ? ?linka*pre, *cur, *ne;
? ? ?pre=head;
? ? ?cur=head->next;
? ? ?while(cur)
? ? ?{
? ? ? ? ? ne = cur->next;
? ? ? ? ? cur->next = pre;
? ? ? ? ? pre = cur;
? ? ? ? ? cur = ne;
? ? ?}
? ? ?head->next = NULL;
? ? ?head = pre;
}
還有一種利用遞歸的方法。這種方法的基本思想是在反轉(zhuǎn)當(dāng)前節(jié)點(diǎn)之前先調(diào)用遞歸函數(shù)反轉(zhuǎn)后續(xù)節(jié)點(diǎn)。源代碼如下。不過(guò)這個(gè)方法有一個(gè)缺點(diǎn),就是在反轉(zhuǎn)后的最后一個(gè)結(jié)點(diǎn)會(huì)形成一個(gè)環(huán),所以必須將函數(shù)的返回的節(jié)點(diǎn)的next域置為NULL。因?yàn)橐淖僪ead指針,所以我用了引用。算法的源代碼如下:
linka* reverse(linka* p,linka*& head)
{
? ? ?if(p == NULL || p->next == NULL)
? ? ?{
? ? ? ? ? head=p;
? ? ? ? ? return p;
? ? ?}
? ? ?else
? ? ?{
? ? ? ? ? linka* tmp = reverse(p->next,head);
? ? ? ? ? tmp->next = p;
? ? ? ? ? return p;
? ? ?}
}
185 對(duì)如下雙鏈表
typedef struct _node
{
int iData;
struct _node *pPrev;
struct _node *pNext;
}node;
a.請(qǐng)寫(xiě)出代碼,將node*n插入到node*p后。
b.如果多線程同時(shí)訪問(wèn)此鏈表,需要加鎖,請(qǐng)說(shuō)明以下步驟
(a)申請(qǐng)內(nèi)存給n.
(b)N數(shù)據(jù)初始化。
(c)插入
注意加鎖和解鎖的時(shí)機(jī)。
node* insert(node* p, node* n)
{
if ((p == NULL) || (n == NULL))
{
return NULL;
}
if (p->pNext != NULL)
{
p->pNext->pPrev = n;
}
n->pPrev = p;
n->pNext = p->pNext;
p->pNext = n;
return n;
}
186、試創(chuàng)建二叉數(shù),并寫(xiě)出常見(jiàn)的幾種遍歷方式 ?
#include "stdio.h"
#include "string.h"
#include <stdlib.h>
#define NULL 0
typedef struct BiTNode{
? ? char data;
? ? struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Create(BiTree T){
? ? char ch;
? ? ch=getchar();
? ? if(ch=='0')
T=NULL;
? ? else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
? ? printf("Error!");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
? ? }
? ? return T;
}
void Preorder(BiTree T){
? ? ?if(T){
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}//先序遍歷
void Inorder(BiTree T){
? ? if(T){
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}//中序遍歷
void Postorder(BiTree T){
? ? if(T){
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}//后序遍歷
187、 前序遍歷輸入,如圖所示,寫(xiě)出后序遍歷輸出結(jié)果?
?例如二叉樹(shù):
?
?
輸入序列ABD..EH...CF.I..G..
輸出結(jié)果為:?
答案:
輸出結(jié)果為:DHEBIFGCA
總結(jié)
以上是生活随笔為你收集整理的C语言 ,嵌入式 ,数据结构 面试题目(3)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。