1. 程式人生 > >C語言 ,嵌入式 ,資料結構 面試題目(3)

C語言 ,嵌入式 ,資料結構 面試題目(3)

182 連結串列題:一個連結串列的結點結構
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
(1)已知連結串列的頭結點head,寫一個函式把這個連結串列逆序 ( 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)已知兩個連結串列head1 和head2 各自有序,請把它們合併成一個連結串列依然有序。(保留所有結點,即便大小相同)
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)已知兩個連結串列head1 和head2 各自有序,請把它們合併成一個連結串列依然有序,這次要求用遞迴方法進行。 (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.利用連結串列實現將兩個有序佇列A和B合併到有序佇列H中,不準增加其他空間。
請提供全一點的程式
以升序為例:
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單向連結串列的反轉是一個經常被問到的一個面試題,也是一個非常基礎的問題。比如一個連結串列是這樣的: 1->2->3->4->5 通過反轉後成為5->4->3->2->1。最容易想到的方法遍歷一遍連結串列,利用一個輔助指標,儲存遍歷過程中當前指標指向的下一個元素,然後將當前節點元素的指標反轉後,利用已經儲存的指標往後面繼續遍歷。原始碼如下:
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;
}
還有一種利用遞迴的方法。這種方法的基本思想是在反轉當前節點之前先呼叫遞迴函式反轉後續節點。原始碼如下。不過這個方法有一個缺點,就是在反轉後的最後一個結點會形成一個環,所以必須將函式的返回的節點的next域置為NULL。因為要改變head指標,所以我用了引用。演算法的原始碼如下:
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 對如下雙鏈表
typedef struct _node
{
int iData;
struct _node *pPrev;
struct _node *pNext;
}node;
a.請寫出程式碼,將node*n插入到node*p後。
b.如果多執行緒同時訪問此連結串列,需要加鎖,請說明以下步驟
(a)申請記憶體給n.
(b)N資料初始化。
(c)插入
注意加鎖和解鎖的時機。
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、試建立二叉數,並寫出常見的幾種遍歷方式 ?
#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、 前序遍歷輸入,如圖所示,寫出後序遍歷輸出結果?
 例如二叉樹:
 


 
輸入序列ABD..EH...CF.I..G..
輸出結果為:?


答案:
輸出結果為:DHEBIFGCA