【C語言】數據結構C語言版 實驗1 線性表的順序實現


運行環境:Dev-C++

vs2013可能不能運行

首先新建一個頭文件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;
}

 

測試:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM