線性表的順序實現——數據結構課堂作業


/**********************************/
/*順序表的頭文件,文件名sequlist.h*/
/**********************************/

#include  <stdio.h>
#include  <stdlib.h>
/**********************************/
/*順序表的頭文件,文件名sequlist.h*/
/**********************************/
#define MAXSIZE 100
typedef int datatype;
typedef struct
{
    datatype a[MAXSIZE];
    int size;
} sequence_list;

/**********************************/
/*函數名稱:initseqlist()         */
/*函數功能:初始化順序表          */
/**********************************/
void initseqlist(sequence_list *L)
{
    L->size=0;
}
/**********************************/
/*函數名稱:input()               */
/*函數功能:輸入順序表            */
/**********************************/
void input(sequence_list *L)
{
    datatype x;
    initseqlist(L);
    printf("請輸入一組數據,以0做為結束符:\n");
    scanf("%d",&x);
    while (x)
    {
        L->a[L->size++]=x;
        scanf("%d",&x);
    }
}
/**********************************/
/*函數名稱:inputfromfile()       */
/*函數功能:從文件輸入順序表      */
/**********************************/
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);
    }
}
/**********************************/
/*函數名稱:print()               */
/*函數功能:輸出順序表            */
/**********************************/
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");
}
View Code

 

/**********************************/
/*文件名稱:lab1-01.c */
/**********************************/
/*基於sequlist.h中定義的順序表,編寫算法函數reverse(sequence_list *L),實現順序表的就地倒置。*/

/**********************************/
/*文件名稱:lab1-01.c             */
/**********************************/
/*基於sequlist.h中定義的順序表,編寫算法函數reverse(sequence_list *L),實現順序表的就地倒置。*/
#include "sequlist.h"
/*請將本函數補充完整,並進行測試*/
void reverse(sequence_list *L)
{
    int i;
    int len = L->size;
    for(i=0;i<len/2;i++) {
        int temp ;
        temp = L->a[i];
        L->a[i] = L->a[len-i-1];
        L->a[len-i-1] = temp;
    }
}
int main()
{
    sequence_list L;            /*定義順序表*/
    input(&L);                    /*輸入測試用例*/
    print(&L);                  /*輸出原表*/
    reverse(&L);                    /*順序表倒置*/
    print(&L);                  /*輸出新表*/
}
View Code

 

/**********************************/
/*文件名稱:lab1_02.c */
/**********************************/

/*編寫一個算法函數void sprit( sequence_list *L1,sequence_list *L2,sequence_list *L3),
將順序表L1中的數據進行分類,奇數存放到存到順序表L2中,偶數存到順序表L3中,編寫main()進行測試。
*/

/**********************************/
/*文件名稱:lab1_02.c             */
/**********************************/

/*編寫一個算法函數void sprit( sequence_list *L1,sequence_list *L2,sequence_list *L3),
將順序表L1中的數據進行分類,奇數存放到存到順序表L2中,偶數存到順序表L3中,編寫main()進行測試。
*/

#include "sequlist.h"
/*請將本函數補充完整,並進行測試*/
void sprit(sequence_list *L1,sequence_list *L2,sequence_list *L3)
{
    initseqlist(L2);
    initseqlist(L3);
    int len = L1->size;
    int i;
    for(i=0;i<len;i++) {
        if((L1->a[i])%2) {
            L2->a[(L2->size)++] = L1 ->a[i];
        }
        else {
            L3->a[(L3->size)++] = L1 ->a[i];
        }


    }

}
int main()
{   sequence_list L1,L2,L3;        /*定義三個順序表*/
    input(&L1);                    /*輸入L1*/
    sprit(&L1,&L2,&L3);            /*對L1進行分類*/
    print(&L1);                    /*輸出L1、L2和L3*/
    print(&L2);
    print(&L3);
}
View Code

 

/*已知順序表L1,L2中數據由小到大有序,請用盡可能快的方法將L1與L2中的數據合並到L3中,使數據在L3中按升序排列。*/

/*已知順序表L1,L2中數據由小到大有序,請用盡可能快的方法將L1與L2中的數據合並到L3中,使數據在L3中按升序排列。*/

#include "sequlist.h"
#include <stdlib.h>
/*請將本函數補充完整,並進行測試*/

void merge(sequence_list *L1,sequence_list *L2,sequence_list *L3)
{
    initseqlist(L3);
    int i,j;
    int len1 = L1->size;
    int len2 = L2->size;
    int pos1 = 0;
    int pos2 = 0;
    int flag = 0;
    for(i=0;i<len1+len2;i++) {
        if(L1->a[pos1]<L2->a[pos2]) {
            L3->a[L3->size++] = L1->a[pos1++];
        }
        else if(L1->a[pos1]>L2->a[pos2]) {
            L3->a[L3->size++] = L2->a[pos2++];
        }
        else if(L1->a[pos1]==L2->a[pos2]) {
            L3->a[L3->size++] = L1->a[pos1];
            pos1 ++;
            pos2 ++;
        }
        if(pos1>=len1||pos2>=len2) {
            flag = 1;
            break;
        }
    }

    if(flag) {
        if(pos1>=len1)
        {
            for(pos2;pos2<len2;pos2++)
                L3 ->a[L3->size++] = L2 ->a[pos2];
        }
        else if(pos2>=len2) {
            for(pos1;pos1<len1;pos1++) {
                L3 ->a[L3->size++] = L1 ->a[pos1];
            }
        }
    }



}
int main()
{
    sequence_list L1,L2,L3;
    input(&L1);                /*輸入時請輸入有序數據*/
    input(&L2);                /*輸入時請輸入有序數據*/
    merge(&L1,&L2,&L3);        /*合並數據到L3*/
    print(&L3);                /*輸出L3*/
}
View Code

 

/*假設順序表la與lb分別存放兩個整數集合,函數inter(seqlist *la,seqlist *lb,seqlist *lc)
的功能是實現求順序表la與lb的交集存放到順序表lc中,請將函數補充完整. */

/**********************************/
/*文件名稱:lab1_04.c */
/**********************************/

/*假設順序表la與lb分別存放兩個整數集合,函數inter(seqlist *la,seqlist *lb,seqlist *lc)
的功能是實現求順序表la與lb的交集存放到順序表lc中,請將函數補充完整.  */

/**********************************/
/*文件名稱:lab1_04.c                 */
/**********************************/
#include "sequlist.h"
/*請將本函數補充完整,並進行測試*/
void  inter(sequence_list *la,sequence_list *lb,sequence_list *lc)
{
    int len1 = la->size;
    int len2 = lb->size;
    initseqlist(lc);
    int i,j;
    for(i=0;i<len1;i++) {
        for(j=0;j<len2;j++) {
            if(la->a[i]==lb->a[j]) {
                lc->a[lc->size++] = la->a[i];
                break;
            }
        }
    }
}
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;
}
View Code

 

/*
請編寫一個算法函數partion(sequence_list *L),盡可能快地將順序表L中的所有奇數調整到表的左邊,
所有偶數調整到表的右邊,並分析算法的時間復雜度。
*/
/**********************************/
/*文件名稱:lab1_05.c */
/**********************************/

/*
請編寫一個算法函數partion(sequence_list *L),盡可能快地將順序表L中的所有奇數調整到表的左邊,
所有偶數調整到表的右邊,並分析算法的時間復雜度。
*/
/**********************************/
/*文件名稱:lab1_05.c                 */
/**********************************/
#include "sequlist.h"
/*請將本函數補充完整,並進行測試*/
void partion(sequence_list *L)
{
    int len = L->size;
    sequence_list Ltemp1;
    sequence_list Ltemp2;
    initseqlist(&Ltemp1);
    initseqlist(&Ltemp2);
    int i;
    for(i=0;i<len;i++) {
        if(L->a[i]%2) {
            Ltemp1.a[Ltemp1.size++] = L->a[i];
        }
        else {
            Ltemp2.a[Ltemp2.size++] = L->a[i];
        }

    }

    initseqlist(L);
    int len1 = Ltemp1.size;
    int len2 = Ltemp2.size;
    //int k = 0;
    for(i=0;i<len1;i++) {
        L->a[L->size++] = Ltemp1.a[i];
    }
    for(i=0;i<len2;i++) {
        L->a[L->size++] = Ltemp2.a[i];
    }

}
int main()
{
  sequence_list L;
  inputfromfile(&L,"3.txt");
  print(&L);                          /*輸出表L*/
  partion(&L);
  print(&L);                          /*輸出新表*/
  return 0;
}
View Code

 


免責聲明!

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



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