1. 程式人生 > >資料結構---線性表的應用例項

資料結構---線性表的應用例項

 將順序表(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;
    }