資料結構---線性表的應用例項
阿新 • • 發佈:2018-12-11
將順序表(a1a2,a3,...,an)重新排列為以a1為界的兩部分:a1前面的值均比a1小,後面的值均比a1大(資料型別均具有可比性,都設為整型)
#include <stdio.h> #include <stdlib.h> #define maxsize 100 typedef struct //順序表結構 { int data[maxsize]; int last; }seqlist; seqlist *init_seqlist(int arrsize) //順序表初始化 { seqlist *L; L=(seqlist*)malloc(sizeof(seqlist)); L->last=arrsize-1; return L; } void input(seqlist *L) { int i; for(i=0;i<=L->last;i++) { scanf("%d",&L->data[i]); } } void show(seqlist*L) { int i; for(i=0;i<=L->last;i++) { printf("%d ",L->data[i]); } } void part(seqlist*L) { int x,y,i,j; x=L->data[0];//將基準置入x中 for(i=1;i<=L->last;i++)//注意i從1開始 { if(L->data[i]<x) { y=L->data[i];//記錄比基準小的數,防止挪位後丟失 for(j=i-1;j>=0;j--)//該數前的數字向後挪一位 { L->data[j+1]=L->data[j]; L->data[0]=y;//將小的數置入第一個數 } } } } int main() { int arrsize; seqlist *L; scanf("%d",&arrsize); L=init_seqlist(arrsize); input(L); part(L); show(L); return 0; }
兩個遞增有序的單鏈表A和B,合成連結串列C,不改變排序性。
輸入輸出樣例:1組
- 樣例輸入:
5 //A連結串列元素個數 2 3 4 10 11 //A連結串列元素內容,遞增有序 3 //B連結串列元素個數 5 6 12 //B連結串列元素內容,遞增有序
樣例輸出:
2 3 4 5 6 10 11 12
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define maxsize 1000 typedef struct { int data[maxsize]; int last; } seqlist; seqlist *init_seqlist(int arrsize) { seqlist *L; L=(seqlist *)malloc(sizeof(seqlist)); L->last=arrsize-1; return L; } void input(seqlist *A) { int i; for(i=0; i<=A->last; i++) { scanf("%d",&A->data[i]); } } void bubblesort(seqlist *A)//j將表進行氣泡排序 { int i,j,temp; for(i=0; i<A->last; i++) { for(j=i+1; j<A->last+1; j++) { if(A->data[j]<A->data[i]) { temp=A->data[j]; A->data[j]=A->data[i]; A->data[i]=temp; } } } } seqlist * merge(seqlist *A,seqlist *B,seqlist *C) { int i=0,j=0,k=0; while(i<=A->last&&j<=B->last) { if(A->data[i]<B->data[j]) { C->data[k++]=A->data[i++]; } else { C->data[k++]=B->data[j++]; } } while(i<=A->last)//表B先結束 { C->data[k++]=A->data[i++]; } while(j<=B->last)//表A先結束 { C->data[k++]=B->data[j++]; } C->last=k-1; return C; } int main() { int i,arrsize1,arrsize2; seqlist *A,*B,*C; C=(seqlist *)malloc(sizeof(seqlist)); scanf("%d",&arrsize1); A=init_seqlist(arrsize1); input(A); scanf("%d",&arrsize2); B=init_seqlist(arrsize2); input(B); bubblesort(A); bubblesort(B); C=merge(A,B,C); for(i=0;i<=C->last;i++) { printf("%d ",C->data[i]); } return 0; }
順序表A中刪除值在x~y(x<=y)之間的所有元素。
輸入輸出樣例:1組
- 樣例輸入:
7 //輸入順序表中結點個數,陣列規模可以很大。但是用這個值來指定當前大陣列中的前幾個用於順序表中的值 1 2 3 3 4 4 2 //輸入當前順序表中的元素都有哪些 3 6 //分別輸入x和y的值,即範圍
- 樣例輸出:
1 2 2
#include <stdio.h> #include <stdlib.h> #define maxsize 100 typedef struct { int data[maxsize]; int last; } seqlist; seqlist *init_seqlist(int arrsize) { seqlist *L; L=(seqlist *)malloc(sizeof(seqlist)); L->last=arrsize-1; return L; } seqlist *result_seqlist(seqlist *L,int x,int y) { int k=0,j,i; seqlist *S; S=(seqlist *)malloc(sizeof(seqlist)); if(x==y) { for(i=0; i<=L->last; i++) { if(L->data[i]==x) { for(j=i+1; j<=L->last; j++) { L->data[j-1]=L->data[j]; } L->last--;i--; } else { S->data[k++]=L->data[i]; } } } else //x,y不相等 { for(i=0; i<=L->last; i++) { if(L->data[i]>=x&&L->data[i]<=y) { for(j=i+1; j<=L->last; j++) //將資料進行向前移一位,即刪除在此範圍內的數 { L->data[j-1]=L->data[j]; } L->last--;i--; //表長減一,i減一,從挪位後的新一個數據判斷 } else { S->data[k++]=L->data[i]; } } } S->last=k-1; return S; } int main() { int i,arrsize,x,y; seqlist *L,*S; scanf("%d",&arrsize); L=init_seqlist(arrsize); for(i=0; i<=L->last; i++) { scanf("%d",&L->data[i]); } scanf("%d %d",&x,&y); S=result_seqlist(L,x,y); for(i=0; i<=S->last; i++) { printf("%d ",S->data[i]); } return 0; }