【C語言】資料結構C語言版 實驗1 線性表的順序實現
阿新 • • 發佈:2020-11-20
執行環境:Dev-C++
首先新建一個頭檔案sequlist.h
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 typedef int datatype; typedef struct{ datatype a[MAXSIZE]; int size; }sequence_list; /*初始化順序表*/ void initseqlist(sequence_list *L) { L->size = 0; } /*輸入順序表*/ void input(sequence_list *L) { datatype x; initseqlist(L); printf("請輸入一組資料,以0做為結束符:\n"); scanf_s("%d", &x); while (x) { L->a[L->size++] = x; scanf_s("%d", &x); } } /*從檔案輸入順序表*/ void inputfromfile(sequence_list *L, char *f) { int i, x; FILE *fp = fopen(f,"r"); L->size = 0; if (fp) { while (!feof(fp)) { fscanf(fp,"%d", &L->a[L->size++]); } fclose(fp); } } /*輸出順序表*/ void print(sequence_list *L) { int i; for (i = 0; i < L->size; i++) { printf("%5d", L->a[i]); if ((i + 1) % 10 == 0) printf("\n"); } printf("\n"); }
1、 基於sequlist.h中定義的順序表,編寫演算法函式reverse(sequence_list *L),實現順序表的就地倒置。
程式碼:
/*原始檔 檔名稱 lab1.c */
#include "sequlist.h" /*請將本函式補充完整,並進行測試*/ void reverse(sequence_list *L) { int i,j; datatype x; i=0; j=L->size-1; while (i<j) { x=L->a[i]; L->a[i]=L->a[j]; L->a[j]=x; i++; j--; } } int main() { sequence_list L; /*定義順序表*/ input(&L); /*輸入測試用例*/ print(&L); /*輸出原表*/ reverse(&L); print(&L); /*輸出新表*/ }
測試:
2、 編寫一個演算法函式void sprit( sequence_list *L1,sequence_list *L2,sequence_list *L3),將順序表L1中的資料進行分類,奇數存放到存到順序表L2中,偶數存到順序表L3中,編寫main()進行測試。
程式碼:
/*原始檔 檔名稱 lab2.c */ #include "sequlist.h" /*請將本函式補充完整,並進行測試*/ void sprit(sequence_list *L1,sequence_list *L2,sequence_list *L3) { int i,j,k; i=j=k=0; for (i=0;i<L1->size;i++) { if (L1->a[i]%2==1) L2->a[j++]=L1->a[i]; else L3->a[k++]=L1->a[i]; } L2->size=j; L3->size=k; } int main() { sequence_list L1,L2,L3; /*定義三個順序表*/ input(&L1); /*輸入L1*/ sprit(&L1,&L2,&L3); /*對L1進行分類*/ print(&L1); /*輸出L1、L2和L3*/ print(&L2); print(&L3); }
測試:
3、 已知順序表L1,L2中資料由小到大有序,請用盡可能快的方法將L1與L2中的資料合併到L3中,使資料在L3中按升序排列。
程式碼:
/*原始檔 檔名稱 lab3.c */ #include "sequlist.h" /*請將本函式補充完整,並進行測試*/ void merge(sequence_list *L1,sequence_list *L2,sequence_list *L3) { int i,j,k; i=j=k=0; while (i<L1->size && j<L2->size ) { if (L1->a[i]<L2->a[j]) L3->a[k++]=L1->a[i++]; else L3->a[k++]=L2->a[j++]; } while (i<L1->size) L3->a[k++]=L1->a[i++]; while (j<L2->size) L3->a[k++]=L2->a[j++]; L3->size=k; } int main() { sequence_list L1,L2,L3; input(&L1); /*輸入時請輸入有序資料*/ input(&L2); /*輸入時請輸入有序資料*/ merge(&L1,&L2,&L3); /*合併資料到L3*/ print(&L3); /*輸出L3*/ }
測試:
4、 假設順序表la與lb分別存放兩個整數集合,函式inter(seqlist *la,seqlist *lb,seqlist *lc) 的功能是實現求順序表la與lb的交集存放到順序表lc中,請將函式補充完整.
新建兩個文字檔案
程式碼:
/*原始檔 檔名稱 lab4.c */ #include "sequlist.h" /*請將本函式補充完整,並進行測試*/ void inter(sequence_list *la,sequence_list *lb,sequence_list *lc) { int i,j,k; k=0; for (i=0; i<la->size; i++) { j=0; while (j<lb->size && la->a[i]!=lb->a[j]) j++; if (j<lb->size) lc->a[k++]=la->a[i]; } lc->size=k; } int main() { sequence_list la,lb,lc; inputfromfile(&la,"1.txt"); /*從檔案1.txt建立順序表*/ inputfromfile(&lb,"2.txt"); /*從檔案2.txt建立順序表*/ print(&la); /*輸出la*/ print(&lb); /*輸出lb*/ inter(&la,&lb,&lc); /*求la與lb的交集存於lc中*/ print(&lc); /*輸出lc*/ return 0; }
測試:
5、 請編寫一個演算法函式partion(sequence_list *L),儘可能快地將順序表L中的所有奇數調整到表的左邊, 所有偶數調整到表的右邊,並分析演算法的時間複雜度。
新建一個文字檔案
程式碼:
/*原始檔 檔名稱 lab5.c */ #include "sequlist.h" /*請將本函式補充完整,並進行測試*/ void partion(sequence_list *L) { int i,j; datatype x; i=0; j=L->size-1; do { while (i<j && L->a[i]%2==1 ) i++; while (i<j && (L->a[j]&0x1)==0) j--; if (i<j) { x=L->a[i]; L->a[i++]=L->a[j]; L->a[j--]=x; } }while (i<j); } int main() { sequence_list L; inputfromfile(&L,"3.txt"); print(&L); /*輸出表L*/ partion(&L); print(&L); /*輸出新表*/ return 0; }
測試: