數據結構期末考試算法
阿新 • • 發佈:2018-06-30
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:此文章只是作為期末考試復習用,過後刪除。
數據結構期末考試算法