1. 程式人生 > >數據結構期末考試算法

數據結構期末考試算法

source 復習 遞歸算法 排列 地址 max #define 遍歷 urn

1.設計一個高效的算法,從順序表L中刪除所有值為x的元素,要求時間復雜度為O(n),空間復雜度為O(1).

//p71
#define MAXSIZE 100
typedef struct
{
    ElemType elem[MAXSIZE];
    int last;
}SeqList;

void delx(SeqList * L,ElemType x)
{
    int i = 0;
    int j = 0;
    while(i <= L->last)
    {
        if(L->elem[i]!=x)
        {
            L->elem[j] = L->elem[i];
            i++;
            j++;
        }
        else
i++; } L->last = j-1; }

2.算法實現帶頭節點單鏈表的就地址逆置問題。

//p72
typedef struct Node
{
    ElemType data;
    struct Node * next;
}Node, *LinkList;

void ReverseList(LinkList L)
{
    Node * p;
    Node * q;
    p = L->next;
    L->next = NULL;
    while(p!=NULL)
    {
        q = p->next;
        p->next = L->next;
        L->next = p;
        p = q;
    }
}

3.已知一個帶頭結點的單鏈表L,其結點的元素值以非遞減順序排列,設計算法刪除該單鏈表中元素值重復的結點。

typedef struct Node
{
    ElemType data;
    struct Node * next;
}Node, *LinkList;

void del(LinkList L)
{
    Node * p;
    Node * q;
    p=L->next;
    if(p==NULL)
        return error;
    while(p->next != NULL)
    {
        if(p->data != p->next->data)
            p = p->next;
        else
{ q = p->next; p->next = q->next; free(q); } } }

4.以二叉鏈表做存儲結構,編寫算法輸出二叉樹中葉子結點(先序)。

//p166
typedef struct Node
{
    DataType data;
    struct Node * LChild;
    struct Node * RChild;

}BiTNode,*BiTree;

void InOrder(BiTNode root)
{
    if(root != NULL)
    {
        InOrder(root->LChild);
        Visit(root->data);
        InOrder(root->RChild);
    }
}

5.以二叉鏈表做存儲結構,編寫遞歸算法,求二叉樹的高度(後序)。

//p169
typedef struct Node
{
    DataType data;
    struct Node * LChild;
    struct Node * RChild;

}BiTNode,*BiTree;

int PostTreeDepth(BiTree bt)
{
    int hl,hr,max;
    if(bt!=NULL)
    {
        hl = PostTreeDepth(bt->LChild);
        hr = PostTreeDepth(bt->RChild);
        max =hl>hr?hl:hr;
        return(max+1);
    }
    else
        return(0);
}

6.以二叉鏈表做存儲結構,編寫遞歸算法,求二叉樹的高度(先序)。

//p169
typedef struct Node
{
    DataType data;
    struct Node * LChild;
    struct Node * RChild;

}BiTNode,*BiTree;

void PreTreeDepth(BiTree bt,int h)
{
    //先序遍歷求二叉樹bt高度的遞歸算法,h為bt指向結點所在層次,初值為1
    //depth 為當前求得的最大層次,為全局變量,調用前初值為0
    if(bt!=NULL)
    {
        if(h>depth)
        {
            depth = h;
        }
        PreTreeDepth(bt->LChild,h+1);
        PreTreeDepth(bt->RChild,h+1);
    }
}

7.折半查找法。

//p267
# define LIST_SIZE 20
typedef struct
{
    KeyType key;
    OtherType other_data;
}RecordType;

typedef struct
{
    RecordType r[LIST_SIZE+1]// r[0] 為工作單元
    int length;
} RecordList;

int BinSrch(RecordList l,KeyType k)
{
    int low = 1;
    int hight = l.length;//設置區間初值
    while(low<=hight)
    {
        mid=(low+hight) / 2;
        if(k==l.r[mid].key)
            return(mid);
        else if(k<l.r[mid].key)
            hight = mid-1;
        else
            low =mid+1;
    }
    return (0);
}

ps:此文章只是作為期末考試復習用,過後刪除。

數據結構期末考試算法