【資料結構週週練】001順序表與連結串列
阿新 • • 發佈:2018-12-14
目錄
前言
從這周開始,我會不定期發一些資料結構練習題,一方面,提升自己的程式設計能力,給自己考研程式碼題打基礎,雖然邏輯都明白,但是一次性寫對程式碼還是有問題,思維不細緻;另一方面,給想學習資料結構的同學提供一些程式設計的練習題,希望能對大家有所幫助。題目程式碼方式不唯一,歡迎大家提供新的解題思路或程式碼。
一、練習1:刪除順序表指定部分元素
1、題目
從給定順序表中刪除i~j的所有元素(包括i,j)。以順序表:0123456789為例,i取3,j取6。
2、程式碼
#define MAXLISTSIZE 20 #define LISTINCREMENT 5 #define OVERFLOW -1 #include<iostream> #include<malloc.h> using namespace std; typedef int ElemType; typedef struct{ ElemType *elem; int length; int listSize; }SqList; int InitSqList(SqList &S) { S.elem = (ElemType *)malloc(MAXLISTSIZE * sizeof(SqList)); if (!S.elem) { return OVERFLOW; } S.length = 0; S.listSize = MAXLISTSIZE; } int CreatSqList(SqList &S) { for (int i = 0; i <= 9; i++) { if (S.length>S.listSize) { ElemType * newBase = (ElemType *)realloc(S.elem, (S.listSize + LISTINCREMENT) * sizeof(ElemType));//重新分配基地址 S.elem = newBase; if (!S.elem) { return OVERFLOW; } } S.length++; S.elem[i] = i; } return 1; } int DeleteElem(SqList &S) { for (int i = 7; i <= S.length; i++) { S.elem[i-4] = S.elem[i]; } S.length -= 4; return 1; } void VisitSqList(SqList S) { for (int i = 0; i < S.length; i++) { cout << S.elem[i] << ","; } cout << endl; } void main() { SqList S; InitSqList(S); CreatSqList(S); cout << "原順序表為:" << endl; VisitSqList(S); DeleteElem(S); cout << "刪除元素後順序表為:" << endl; VisitSqList(S); }
3、執行結果
二、練習2:逆置連結串列
1、題目
建立一個長度為10的線性單鏈表:0123456789。並將其逆置,要求逆置過程不能創立新結點。
2、程式碼
#include<iostream> #include<malloc.h> using namespace std; typedef int ElemType; //建立連結串列 typedef struct LNode { ElemType elem; struct LNode *next; }LNode,*LinkList; //初始化連結串列 int InitList(LinkList &L) { L = (LinkList)malloc(sizeof(LNode)); if (!L)//儲存分配失敗 exit(OVERFLOW); L->next = NULL; return 1; } //尾插法建立連結串列 int CreatList(LinkList &L) { L->elem = 0; LinkList p = L; LinkList q; for (int i = 1; i <= 9; i++) { q = (LinkList)malloc(sizeof(LNode)); q->elem = i; q->next = NULL; p->next = q; p = q; q = p->next; } return 1; } //頭插法逆置連結串列 int HeadInsertList(LinkList &L) { LinkList p,q; p = L->next; q = p; L->next = NULL; while (q) { q = p->next; p->next = L; L = p; p = q; } return 1; } //遍歷連結串列,檢視逆置結果。 void VisitList(LinkList L) { LinkList p = L; while (p) { cout << p->elem << ","; p = p->next; } cout << endl; } void main() { LinkList L; InitList(L); CreatList(L); cout << "遍歷L:" << endl; VisitList(L); HeadInsertList(L); cout << "遍歷逆序後的L" << endl; VisitList(L); }
3、執行結果
三、練習3:拆分連結串列
1、題目
將一個長度為10的線性單鏈表:0123456789中的偶數取出,放到另一個單鏈表中,要求保持原來順序。
2、程式碼
#include<iostream> #include<malloc.h> using namespace std; typedef int ElemType; //建立連結串列 typedef struct LNode { ElemType elem; struct LNode *next; }LNode, *LinkList; //初始化連結串列 int InitList(LinkList &L) { L = (LinkList)malloc(sizeof(LNode)); if (!L)//儲存分配失敗 exit(OVERFLOW); L->next = NULL; return 1; } //尾插法建立連結串列 int CreatList(LinkList &L) { LinkList p = L; LinkList q; for (int i = 0; i <= 9; i++) { q = (LinkList)malloc(sizeof(LNode)); q->elem = i; q->next = NULL; p->next = q; p = q; q = p->next; } return 1; } //分解連結串列 int ApartList(LinkList &L, LinkList &M) { LinkList p = L; LinkList q = L->next; LinkList m = M; while (q) { if (q->elem % 2 == 0) { p->next = q->next; p = q->next; m->next = q; q->next = NULL; m = q; } q = p->next; } return 1; } void VisitList(LinkList &L) { LinkList p = L->next; while (p) { cout << p->elem << ","; p = p->next; } cout << endl; } void main() { LinkList L, M; InitList(L); CreatList(L); cout << "分解前的L連結串列為:"; VisitList(L); InitList(M); ApartList(L, M); cout << "分解後的L連結串列為:"; VisitList(L); cout << "分解後的M連結串列為:"; VisitList(M); }