数据结构(c语言版)(第三版)实验1

1、实验1 线性表的顺序实现

运行环境:Dev-C++

一、实验目的

1.掌握顺序表的存储结构形式及其描述方法和基本运算的实现

2.掌握用顺序表表示集合等数据的方法,并能设计出合理的存储结构,编写出有关运算的算法。

二、实验内容

已知顺序表与相关函数定义如下(源代码文件sequlist.h),基于该内容完成实验题1~实验5。

#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("%d",&x);
    while(x){
        L->a[L->size++]=x;
        scanf("%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.1

编写算法函数reverse(sequence_list *L),实现顺序表的倒置。

#include <iostream>
#include"sequlist.h"
#include<cstdio>
using namespace std;
void reverse(sequence_list *L){
    int size=L->size;
    int b[105];
    for(int i=0;i<size;i++){
        b[i]=L->a[i]; 
    } 
    for(int i=0;i<size;i++){
        L->a[i]=b[size-i-1];
    }
}
int main(int argc, char** argv) {
    sequence_list L;
    initseqlist(&L);
    input(&L);
    print(&L);
    reverse(&L);
    print(&L);
    return 0;
}

实验1.2

编写一个算法函数void sprit(sequence_list *L1,sequence_list *L2,sequence_list *L3),将顺序表中L1的数据进行分类,奇数存放到顺序表L2中,偶数存放到顺序表L3中。

#include <iostream>
#include"sequlist.h"
#include<cstdio>
using namespace std;
void  sprit(sequence_list *L1,sequence_list *L2,sequence_list *L3){
    initseqlist(L2);
    initseqlist(L3);
    int size1=L1->size;
    for(int i=0;i<size1;i++){
        if(L1->a[i]%2==0){
            L3->a[L3->size]=L1->a[i];
            L3->size++;
        }
        else{       
            L2->a[L2->size]=L1->a[i];
            L2->size++;
        }
    }
}
int main(){
    sequence_list L1,L2,L3;
    initseqlist(&L1);
    initseqlist(&L2);
    initseqlist(&L3);
    input(&L1);
    sprit(&L1,&L2,&L3);
    print(&L1);
    print(&L2);
    print(&L3);
    return 0;
}

实验1.3

已知顺序表L1和L2中数据均由小到大排序,请用尽可能快的方法将L1和L2中的数据合并到L3中,使数据在L3中按升序排列。

#include <iostream>
#include"sequlist.h"
#include<cstdio>
using namespace std;
void merge(sequence_list *L1,sequence_list *L2,sequence_list *L3){
    int i=0,j=0,k=0;
    while(i<L1->size&&j<L2->size){
        if(L1->a[i]<L2->a[j]){
            L3->a[k++]=L1->a[i++];
            L3->size++;
        }
        else{
            L3->a[k++]=L2->a[j++];
            L3->size++;
        }
    }
    while(i<L1->size){
        L3->a[k++]=L1->a[i++];
        L3->size++;
    }
    while(j<L2->size){
        L3->a[k++]=L2->a[j++];
        L3->size++;
    }
}
int main(){
    sequence_list L1,L2,L3;
    initseqlist(&L1);
    initseqlist(&L2);
    initseqlist(&L3);
    input(&L1);
    input(&L2);
    merge(&L1,&L2,&L3);
    print(&L3); 
    return 0;
}

实验1.4

假设顺序表la和lb分别存放两个整数集合,函数void inter(sequence_list *la,sequence_list *lb,sequence_list *lc)的功能是将顺序表la和lb的交集存放到lc中。

#include <iostream>
#include"sequlist.h"
#include<cstdio>
using namespace std;
void inter(sequence_list *la,sequence_list *lb,sequence_list *lc){
    int i=0,j=0;
    for(;i<la->size;i++){
        for(j=0;j<lb->size;j++){
            if(la->a[i]==lb->a[j]){
                lc->a[lc->size++]=la->a[i];
                break;
            }
        }
    }
}
int main(){
    sequence_list la,lb,lc;
    initseqlist(&la);
    initseqlist(&lb);
    initseqlist(&lc);
    inputfromfile(&la,"1.txt");
    inputfromfile(&lb,"2.txt");
    print(&la);
    print(&lb);
    inter(&la,&lb,&lc);
    print(&lc); 
    return 0;
}

实验1.5

请编写一个算法函数void partion(sequence_list *L),尽可能的将顺序表*L中的所有奇数调整到表的左边,所有偶数调整到表的右边,并分析算法时间复杂度。

#include <iostream>
#include"sequlist.h"
#include<cstdio>
using namespace std;
void partion(sequence_list *L){
    int size=L->size;
    int i=0,j=size-1;
    int c[105]={0};
    for(int i=0;i<size;i++){
        c[i]=L->a[i];
    }
    i=0;
        for(int k=0;k<size;k++){
            if(c[k]%2==1){
                L->a[i++]=c[k];
            }
            else{
                L->a[j--]=c[k];
            }
    }   
}
int main(){
    sequence_list L;
    initseqlist(&L);
    inputfromfile(&L,"3.txt");
    print(&L);  
    partion(&L);
    print(&L); 
    return 0;
}
  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanlangke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值