diff --git a/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.6.cpp b/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.6.cpp new file mode 100644 index 0000000..f3c4972 --- /dev/null +++ b/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.6.cpp @@ -0,0 +1,74 @@ +#include +#include +#include + +using namespace std; + +#pragma region 建立顺åº�存储的线性表 + +#define MAX 30 +#define _for(i,a,b) for( int i=(a); i<(b); ++i) +#define _rep(i,a,b) for( int i=(a); i<=(b); ++i) + +typedef struct { + int data[MAX]; + int length; +}List; + +void swap(int* a, int* b) { + int t; + t = *a; + *a = *b; + *b = t; +} + +//给定一个List,传入List的大å°�,è¦�逆转的起始ä½�ç½® +void Reserve(List* list, int start, int end, int size) { + if (end <= start || end >= size) { + return; + } + int mid = (start + end) / 2; + _rep(i, 0, mid - start) { + swap(&list->data[start + i], &list->data[end - i]); + } +} + +void PrintList(List list) { + _rep(i, 1, list.length) { + cout << list.data[i] << " "; + } + cout << endl; +} + +#pragma endregion + +//P278.6 +//写出折å�ŠæŸ¥æ‰¾çš„递归算法。åˆ�始调用时,1ow为1,high为ST.length。 + +int BinSearch(List list, int key, int low, int high) { + + // 返回key在表中的åº�å�· + if (low > high) { + return 0; + } + int mid = (low + high) / 2; + if (key > list.data[mid]) + return BinSearch(list, key, mid + 1, high); + else if (key < list.data[mid]) + return BinSearch(list, key, low, mid - 1); + else + return mid; +} + +int main() +{ + List list; + list.length = 9; + int Data[] = { -99999,2,3,5,7,9,11,13,15,41 }; + //顺åº�表的第0个ä½�ç½®ä¸�存数æ�® + for (int i = 1; i <= list.length; i++) + list.data[i] = Data[i]; + PrintList(list); + cout << "ä½�置为:" << BinSearch(list, 15, 1, list.length) << endl; + return 0; +} \ No newline at end of file diff --git a/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.7(1).cpp b/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.7(1).cpp new file mode 100644 index 0000000..a60449c --- /dev/null +++ b/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.7(1).cpp @@ -0,0 +1,79 @@ +#include +#include +#include + +using namespace std; + +#pragma region 建立顺åº�存储的线性表 + +#define MAX 30 +#define _for(i,a,b) for( int i=(a); i<(b); ++i) +#define _rep(i,a,b) for( int i=(a); i<=(b); ++i) + +typedef struct { + int data[MAX]; + int length; +}List; + +void swap(int* a, int* b) { + int t; + t = *a; + *a = *b; + *b = t; +} + +//给定一个List,传入List的大å°�,è¦�逆转的起始ä½�ç½® +void Reserve(List* list, int start, int end, int size) { + if (end <= start || end >= size) { + return; + } + int mid = (start + end) / 2; + _rep(i, 0, mid - start) { + swap(&list->data[start + i], &list->data[end - i]); + } +} + +void PrintList(List list) { + _for(i, 0, list.length) { + cout << list.data[i] << " "; + } + cout << endl; +} + +#pragma endregion + +//P278.7(1) +//线性表中å�„结点的检索概率ä¸�等时,å�¯ç”¨å¦‚下策略æ��高顺åº�检索的效率:若找到指定的 +//结点,则将该结点和其å‰�驱结点(若存在)交æ�¢, 使得ç»�常被检索的结点尽é‡�ä½�于表的 +//å‰�端。试设计在顺åº�结构和链å¼�结构的线性表上实现上述策略的顺åº�裣索算法。 + +//顺åº�实现 +int Search(List &list, int key) { + + int i = 0; + for (i; i < list.length && list.data[i] != key; i++); + if (i < list.length && i > 0) { + swap(list.data[i], list.data[i - 1]); + return --i; + } + return -1; +} + +int main() +{ + List list; + list.length = 9; + int Data[] = {2,3,5,7,9,11,13,15,41 }; + //顺åº�表的第0个ä½�ç½®ä¸�存数æ�® + for (int i = 0; i < list.length; i++) + list.data[i] = Data[i]; + PrintList(list); + cout << "ä½�置为:" << Search(list, 9) << endl; + cout << "ä½�置为:" << Search(list, 9) << endl; + cout << "ä½�置为:" << Search(list, 9) << endl; + cout << "ä½�置为:" << Search(list, 9) << endl; + cout << "ä½�置为:" << Search(list, 13) << endl; + cout << "ä½�置为:" << Search(list, 13) << endl; + PrintList(list); + return 0; +} \ No newline at end of file diff --git a/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.7(2).cpp b/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.7(2).cpp new file mode 100644 index 0000000..ff1411f --- /dev/null +++ b/查找/顺åº�折å�ŠæŸ¥æ‰¾/P278.7(2).cpp @@ -0,0 +1,102 @@ +#include +#include +using namespace std; + +#pragma region ½¨Á¢´øÍ·½áµãµÄÁ´±í + +#define ElemType int +#define _for(i,a,b) for(int i=(a);i<(b);i++) + +typedef struct LNode { + ElemType data; + struct LNode* next; +}LNode, * LinkList; + +//³õʼ»¯Á´±í +bool InitList(LinkList& L) { + //·ÖÅäÒ»¸öÍ·½áµã + L = (LNode*)malloc(sizeof(LNode)); + //ÄÚ´æ²»×㣬·ÖÅäʧ°Ü + if (L == NULL) { + return false; + } + //Í·½áµãÖ®ºóÔÝʱ»¹Ã»Óнڵã + L->next = NULL; + return true; +} + + +//ÅжÏÊÇ·ñΪ¿Õ +bool IsEmpty(LinkList L) { + return ((L->next) == NULL); +} + +//ʹÓÃβ²å·¨½¨±í +LinkList CreatList(vector data) { + if (data.size() < 1) { + return NULL; + } + //Í·½áµã + LNode* head = (LinkList)malloc(sizeof(LNode)); + head->data = NULL; + head->next = NULL; + LinkList p = head; + _for(i, 0, data.size()) { + LNode* s = (LinkList)malloc(sizeof(LNode)); + s->data = data[i]; + s->next = NULL; + p->next = s; + p = s; + } + return head; +} +//Êä³öÁ´±í +void PrintList(LinkList list) { + list = list->next; + while (list != NULL) { + printf("%d ", list->data); + list = list->next; + } + printf("\n"); +} + +#pragma endregion + +//P278.7(2) +//ÏßÐÔ±íÖи÷½áµãµÄ¼ìË÷¸ÅÂʲ»µÈʱ,¿ÉÓÃÈçϲßÂÔÌá¸ß˳Ðò¼ìË÷µÄЧÂÊ:ÈôÕÒµ½Ö¸¶¨µÄ +//½áµã,Ôò½«¸Ã½áµãºÍÆäǰÇý½áµã(Èô´æÔÚ)½»»», ʹµÃ¾­³£±»¼ìË÷µÄ½áµã¾¡Á¿Î»ÓÚ±íµÄ +//ǰ¶Ë¡£ÊÔÉè¼ÆÔÚ˳Ðò½á¹¹ºÍÁ´Ê½½á¹¹µÄÏßÐÔ±íÉÏʵÏÖÉÏÊö²ßÂÔµÄ˳ÐòñÏË÷Ëã·¨¡£ + +//Á´Ê½ÊµÏÖ + +int Search(LinkList &head,ElemType key) { + + int i = 0; + LinkList p = head->next,pre=head; + while (p && p->data != key) { + i++; + pre = p; + p = p->next; + } + if (p) { + swap(p->data, pre->data); + return --i; + } + return -1; +} + +int main() +{ + vector data{ 2,4,6,8,13,23,36,41,63 }; + LinkList head; + InitList(head); + head = CreatList(data); + PrintList(head); + cout << "λÖÃΪ£º" << Search(head, 8) << endl; + cout << "λÖÃΪ£º" << Search(head, 8) << endl; + cout << "λÖÃΪ£º" << Search(head, 8) << endl; + cout << "λÖÃΪ£º" << Search(head, 41) << endl; + cout << "λÖÃΪ£º" << Search(head, 41) << endl; + PrintList(head); + return 0; +}