西南交通大學計算機專業考研真題答案詳解8:2010年演算法設計題
阿新 • • 發佈:2018-11-08
一、考研真題
3、設計一演算法,實現在資料元素有序的順序儲存結構的線性表中插入一個值為x的操作。如果無儲存空間則插入失敗,函式的返回值為插入成功與否的標誌。(8分)
4、設有兩個整數集合A和B,分別用遞增有序連結串列表示,設計一演算法實現兩個集合的聯合運算,運算結果也有遞增有序連結串列表示。運算後,A、B兩個連結串列保持不變。(8分)
二、真題解析
3、設計一演算法,實現在資料元素有序的順序儲存結構的線性表中插入一個值為x的操作。如果無儲存空間則插入失敗,函式的返回值為插入成功與否的標誌。(8分)
#define QElemType int #define MaxQSize 100 //佇列最大元素個數 typedef struct { QElemType *base; int rear;//指向迴圈佇列中隊尾元素的位置 int length;//表示佇列中所含資料元素的個數 }SqQueue; SqQueue Q; int InsertQueue(SqQueue &L,int x) { //佇列以滿,插入失敗 if (L.length>=MaxQSize) return -1; if(L.length<2)return -1; int flag;//佇列增序1,減序-1 if (L.base[L.length-1]-L.base[0]>=0) { flag=1; } else { flag=-1; } int m_index; for (int i=L.length-1;i>=0;i--) { if (flag*(L.base[i]-x)<0) { m_index=i; break; }else{ L.base[i+1]=L.base[i]; } } L.base[m_index+1]=x; L.length++; return 0; }
4、設有兩個整數集合A和B,分別用遞增有序連結串列表示,設計一演算法實現兩個集合的聯合運算,運算結果也有遞增有序連結串列表示。運算後,A、B兩個連結串列保持不變。(8分)
LNode* Union(LNode* La,LNode* Lb) { if (La==NULL&&Lb==NULL) return NULL; if(La==NULL&&Lb!=NULL) return Lb; if(La!=NULL&&Lb==NULL) return La; LNode *pCHead = NULL; //A與B交集頭 LNode *pCEnd = NULL; //A與B交集尾 //建立頭結點 pCHead = new LNode(); pCHead->next = NULL; pCEnd = pCHead; LNode *pA = La->next; //指向有序列表A第一個結點 LNode *pB = Lb->next; //指向有序列表B第一個結點 while (pA != NULL && pB != NULL) { int data; if (pA->data == pB->data) { data = pA->data; //相等,同時後移 pA = pA->next; pB = pB->next; } else if (pA->data > pB->data) { data= pB->data; //最小的相比,B小 B後移 pB = pB->next; } else { data = pA->data; //最小的相比,A小 A後移 pA = pA->next; } LNode *pNode = new LNode(); pNode->data = data; //插入新建結點 pNode->next = pCEnd->next; pCEnd->next = pNode; pCEnd=pNode; } if (pB!=NULL) { pA=pB; } while (pA!=NULL) { LNode *pNode = new LNode(); pNode->data = pA->data; //插入新建結點 pNode->next = pCEnd->next; pCEnd->next = pNode; pCEnd=pNode; pA=pA->next; } return pCHead; }