1、設計演算法,對帶頭結點的單鏈表實現就地逆置。並給出單鏈表的儲存結構(資料類型)的定義。
#include <iostream>#include <cstdlib>#include <cstdio>#include <ctime>using namespace std;typedef char ElemType;typedef struct Node{ElemType data;struct Node *next;}Node, *LinkList;LinkList CreateList(){LinkList L;ElemType c;L = (LinkList)malloc(sizeof(Node));L->next = NULL;Node *p , *tail;tail = L;c = getchar();while(c != '#'){p = (Node *)malloc(sizeof(Node));p->data = c;tail->next = p;tail = p;c = getchar();}tail->next = NULL;return L;}void ShowList(LinkList L){Node *p;p = L->next;while(p != NULL){cout << p->data << " ";p = p->next;}cout << endl;}void ReverseList(LinkList L){Node *p, *q;p = L->next;L->next = NULL;while(p != NULL){q = p->next;p->next = L->next;L->next = p;p = q;}}int main(){LinkList L;L = CreateList();ShowList(L);ReverseList(L);ShowList(L);return 0;}
2、編寫遞迴演算法,將二叉樹中所有結點的左、右子樹相互交換。並給出演算法中使用的二叉樹的儲存結構(資料類型)的定義。
typedef struct BiNode{char data;struct BiNode *left;struct BiNode *right;}BiNode, *BiTree;
BiNode* Exchange(BiNode* T){ BiNode* p; if(NULL==T || (NULL==T->lchild && NULL==T->rchild)) return T; p = T->lchild; T->lchild = T->rchild; T->rchild = p; if(T->lchild) { T->lchild = Exchange(T->lchild); } if(T->rchild) { T->rchild = Exchange(T->rchild); } return T;}
3、折半尋找演算法。
#include<iostream>#include<cstdio>using namespace std;int search(int *array, int n, int target){ int low = 0; int high = n - 1; if( low > high ) return -1; while( low <= high ) { int mid = low + ( high - low ) / 2; if( array[mid] < target ) low = mid + 1; else if( array[mid] > target ) high = mid - 1; else return mid; }}int main(){ int a[] = {1,2,3,4,5,6,7,8,9}; cout<<search(a,9,4)<<endl;return 0;}
4、資料結構課本P74,習題2、13
void DeleteNode( ListNode *s) {//刪除單迴圈鏈表中指定結點的直接前趨結點 ListNode *p, *q; p=s; while( p->next->next!=s) p=p->next; //刪除結點 q=p->next; p->next=q->next; free(p); //釋放空間 }
5、統計葉子結點數。P168
#include<iostream>#include<queue>#include <cstdlib>#include <cstdio>using namespace std;typedef struct BiNode{char data;struct BiNode *left;struct BiNode *right;}BiNode, *BiTree;int sum = 0;void CreateBinaryTree(BiTree &T)//二叉樹建立 abc,,de,g,,f,,,{//T = (BiNode*) malloc (sizeof(BiNode));T = new BiNode;cin >> T->data;if(T->data == ',') {T = NULL; }if(T != NULL){CreateBinaryTree(T->left);CreateBinaryTree(T->right);}}void PreOrder(BiTree T)//前序走訪{if(T != NULL){cout << T->data;PreOrder(T->left);PreOrder(T->right);}}void InOrder(BiTree T)//中序遍曆{if(T != NULL){InOrder(T->left);cout << T->data;InOrder(T->right);}}void PostOrder(BiTree T)//後序遍曆{if(T != NULL){PostOrder(T->left);PostOrder(T->right);cout << T->data;}}void LevOrder(BiTree T)//層次遍曆{if(T != NULL){BiTree p = T;queue<BiTree>que;que.push(p);while(!que.empty()){p = que.front();cout << p->data;que.pop();if(p->left != NULL){que.push(p->left);}if(p->right != NULL){que.push(p->right);}}}}int Size(BiTree T)//計算二叉樹節點數{if(T != NULL){if(T->left == NULL && T->right == NULL){sum++;}Size(T->left);Size(T->right);}return sum;}int Deep(BiTree T)//計算二叉樹深度{int m, n;if(T == NULL) return 0;m = Deep(T->left);n = Deep(T->right);if(m > n) return m + 1;else return n + 1;}int main(void){BiTree T;CreateBinaryTree(T);cout << "前序走訪結果為:" << endl;PreOrder(T);cout << endl << endl;cout << "中序遍曆結果為:" << endl;InOrder(T);cout << endl << endl;cout << "後序遍曆結果為:" << endl;PostOrder(T);cout << endl << endl;cout<<"層次遍曆結果為:"<<endl;LevOrder(T);cout << endl << endl;cout << "二叉樹分葉節點個數為:" << Size(T)<<endl;cout << "二叉樹深度數為:" << Deep(T) << endl;system("pause");return 0;}
6、順序表的合并。
#define MAXSIZE 100typedef int ElemType;typedef struct SeqList{ElemType elem[MAXSIZE];int last;}SeqList;void mergeList(SeqList *LA, SeqList * LB, SeqList *LC){int i, j, k;i = j = k = 0;while (i <= LA->last && j <= LB->last){if (LA->elem[i] <= LB->elem[j]){LC->elem[k++] = LA->elem[i++];}else{LC->elem[k++] = LB->elem[i++];}}while (i <= LA->last){LC->elem[k++] = LA->elem[i++];}while (j <= LB->last){LC->elem[k++] = LB->elem[j++];}LC->last = LA->last + LB->last + 1;}