第二十六课 实现线性表基本操作的函数 【项目1-4】

第二十六课 实现线性表基本操作的函数



项目一【有序数组中插入数据(函数版)】

有一个足够“大”的数组a,其中已经存储了n个呈升序排列的数据。调用函数insert(a, n, m),可以将数m插入到a中的合适位置,使其仍然保持升序,并且返回值为数组中有效数字的个数(即原先的n加1)。
  例如,若a中数据为1 7 8 17 23 24 59 62 101,n=9,需要插入的数字m为50,调用函数insert(a, n, m)后,a中数据为1 7 8 17 23 24 50 59 62 101,n=10。
  下面给出了调用函数insert的main函数,请写出insert函数来,实现上述功能。

[cpp]  view plain  copy
 print ?
  1. int main()  
  2. {  
  3.     int a[N]= {1, 7, 8, 17, 23, 24, 59, 62, 101};  
  4.     int i, n=9;  
  5.     int m =50;  
  6.     n = insert(a, n, m);   //在长度为n的a数组中插入m,使仍保持有序  
  7.     for(i=0; i<n; ++i)  
  8.         printf("%d ", a[i]);  
  9.     printf("\n");  
  10.     return 0;  
  11. }  
代码:
#include<stdio.h>
#define N 10
int main()
{
    int a[10]={11,22,33,44,55,66,77,88,99};
    int i,j,num,t;
    for(i=0;i<N-1;i++)
        printf("%d ",a[i]);
    printf("\n输入数字:");
    scanf("%d",&num);
    a[9]=num;
    for(j=0;j<N-1;j++)
        for(i=0;i<N-j-1;i++)
        {
            if(a[i]>a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
            }
        }
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
        printf("\n");
    return 0;
}
运行结果:
第二十六课 实现线性表基本操作的函数 【项目1-4】_第1张图片


项目二【删除数组元素】
del函数的作用是删除数组a中的指定元素x,n为数组a的元素个数。函数的返回值,为删除元素后的有效元素个数(数组中可能有重复元素)。函数的原型为:
int del (int a[10],int n,int x)
(1)请实现这个函数,并完成测试。
(2)如果在函数调用时,要求数组中的元素呈升序排列呢?

(1)代码:
#include<stdio.h>
int del(int a[],int n,int x);
int main()
{
    int a[]={76,76,72,58,77,85,92,76,96,88,77,67,86,68,78,87,64,59,76,76};
    int i,n,x;
    n=20;
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    printf("\n请输入要删除的元素:");
    scanf("%d",&x);
    n=del(a,n,x);
    printf("\n");
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}
int del(int a[],int n,int x)
{
    int i,j;
    for(i=0;i<n-1;i++)
    {
        if(x==a[i])
        {
            for(j=i;j<n;j++)
                a[j]=a[j+1];
            n--;
            i--;
        }
    }
    if(x==a[n-1])
        n--;
    return n;
}

运行结果:


(2)代码:
#include<stdio.h>
int del(int a[],int n,int x);
int main()
{
    int a[]={7,9,15,16,16,25,34,48,49,56,59,63,67,77,85,94,96,126,140,140};
    int i,n,x;
    n=20;
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    printf("\n请输入要删除的元素:");
    scanf("%d",&x);
    n=del(a,n,x);
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}
int del(int a[],int n,int x)
{
    int i,j;
    for(i=0;i<n-1;i++)
    {
        if(a[i]==x)
        {
            for(j=i;j<n-1;j++)
                a[j]=a[j+1];
            n--;
            i--;
        }
        if(a[i]>x)
            break;
    }
    if(a[n-1]==x)
        n--;
    return n;
}
运行结果:
第二十六课 实现线性表基本操作的函数 【项目1-4】_第2张图片




项目三 【 数组的排序】

(1)编写函数,完成冒泡排序
要求不能改变下面的main函数。

[cpp]  view plain  copy
 print ?
  1. //两个函数bubble_sort和output_array的声明  
  2.      
  3. int main( )  
  4. {  
  5.     int a[20]={86,76,62,58,77,85,92,80,96,88,77,67,80,68,88,87,64,59,61,76};  
  6.     int b[15]={27,61,49,88,4,20,28,31,42,62,64,14,88,27,73};  
  7.     bubble_sort(a,20);   //用冒泡法按降序排序a中元素  
  8.     output_array(a,20);   //输出排序后的数组  
  9.     bubble_sort(b,15);   //用冒泡法按降序排序b中元素  
  10.     output_array(b,15);   //输出排序后的数组  
  11.     return 0;  
  12. }  
  13. //请在下面定义bubble_sort和output_array函数  

(2)字符数组排序:改造(1)的程序,使其能对字符数组进行排序,其中:
[cpp]  view plain  copy
 print ?
  1. int a[20]={...};  
  2. int b[15]={...};  
改为
[cpp]  view plain  copy
 print ?
  1. char a[20] = {'s','o','r','t','b','u','b','b','l','e','s','e','l','e','c','t','o','k','o','k'};  
  2. char b[15] = {'a','b','a',...};  //自己补足  
(3)体验选择排序:改造(1)的程序,将bubble_sort(...)改为select_sort(...),排序算法由冒泡排序换作为选择排序,排序结果由降序变为升序,完成类似的任务。

(1)代码:
#include <stdio.h>
void bubble_sort(int a[],int n);
void output_array(int a[],int n);
int main( )
{
    int a[20]={86,76,62,58,77,85,92,80,96,88,77,67,80,68,88,87,64,59,61,76};
    int b[15]={27,61,49,88,4,20,28,31,42,62,64,14,88,27,73};
    bubble_sort(a,20);   //用冒泡法按降序排序a中元素
    output_array(a,20);   //输出排序后的数组
    bubble_sort(b,15);   //用冒泡法按降序排序b中元素
    output_array(b,15);   //输出排序后的数组
    return 0;
}
void bubble_sort(int a[],int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
            if(a[j]<a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
    }
    printf("\n");
}

void output_array(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}
运行结果:
第二十六课 实现线性表基本操作的函数 【项目1-4】_第3张图片


(2)代码:
#include <stdio.h>
void bubble_sort(char a[],int n);
void output_array(char a[],int n);
int main( )
{
    char a[20] = {'s','o','r','t','b','u','b','b','l','e','s','e','l','e','c','t','o','k','o','k'};
    char b[15] = {'c','b','a','n','f','l','e','d','o','g','j','h','m','i','k'};
    bubble_sort(a,20);   //用冒泡法按降序排序a中元素
    output_array(a,20);   //输出排序后的数组
    bubble_sort(b,15);   //用冒泡法按降序排序b中元素
    output_array(b,15);   //输出排序后的数组
    return 0;
}
void bubble_sort(char a[],int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
            if(a[j]<a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
    }
    printf("\n");
}
void output_array(char a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%c ",a[i]);
    printf("\n");
}
运行结果:


(3)代码:
#include <stdio.h>
void select_sort(int a[],int n);
void output_array(int a[],int n);
int main( )
{
    int a[20]={86,76,62,58,77,85,92,80,96,88,77,67,80,68,88,87,64,59,61,76};
    int b[15]={27,61,49,88,4,20,28,31,42,62,64,14,88,27,73};
    select_sort(a,20);   //用选择法按升序排序a中元素
    output_array(a,20);   //输出排序后的数组
    select_sort(b,15);   //用选择法按升序排序b中元素
    output_array(b,15);   //输出排序后的数组
    return 0;
}
void select_sort(int a[],int n)
{
    int i,j,k,t;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        {
            if(a[k]>a[j])
            {
                k=j;
            }
        }
        t=a[k];
        a[k]=a[i];
        a[i]=t;
    }
    printf("\n");
}

void output_array(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}
运行结果:
第二十六课 实现线性表基本操作的函数 【项目1-4】_第4张图片


项目四 【查成绩】

(1)score1.txt提供了某大学两个班某次测验的数据,包括每位同学的学号及成绩。
请编程序,输入学号,查找出该同学的成绩。
提示1:可以定义两个int型数组,其中一个n存放学号,另一个s存放成绩,可以保证两个数组中,元素下标相同,对应的是同一位同学。例如n[18]值为3123,s[18]为98,说明学号为3123的同学成绩为98。
提示2:因为数据无序,运用顺序查找算法,在n数组中依据学号进行查找,在s数组中对应下标的值则为其成绩。例如,通过在n中的查找,得出学号为3123的同学的下标为18,则其成绩为s[18]。
下面是完成应用的部分代码,已经能够输出成绩清单。请在此基础上实现有关的函数:

[cpp]  view plain  copy
 print ?
  1. int main()  
  2. {  
  3.     int num[200], score[200];  //分别保存学号和成绩  
  4.     int count;  //代表学生人数  
  5.     int index;  //代表查找到的学生的下标  
  6.     int key;  
  7.     count = readData(num, score);   //将成绩数据从文件中读到数组中  
  8.     printf("请输入要查找的学生学号:");  
  9.     scanf("%d",&key);  
  10.     index = search(num, count, key);  //在count个学生中查找学号为key的学生对应的下标  
  11.     if(index<0)    //输入的学号不存在时,index的值要求返回-1  
  12.         printf("不存在学号为%d的同学\n",key);  
  13.     else  
  14.         printf("学号为%d的同学的成绩是:%d\n", key, score[index]);  
  15.     return 0;  
  16. }  

(2)在实际工程中,为了让频繁执行的查询更快一些,常要求对数据进行排序,再进行查询。请改造程序:①在调用readData(num, score);读入数据后,立即调用自定义函数sort对两个数组进行排序(注意在排序需要交换时,应该同时交换两个数组中对应的值,以保证同一下标,对应的是同一个学生的学号和成绩);②这样,search函数可以实现为二分查找了;③改造main函数,支持多次的查找。

(1)代码:
#include<stdio.h>
#include<stdlib.h>
int readData(int a[],int b[]);
int search(int a[],int n,int key);
int main()
{
    int num[200],score[200];
    int count;
    int index;
    int key;
    count=readData(num,score);
    printf("请输入要查找的学生学号:");
    scanf("%d",&key);
    index=search(num,count,key);
    if(index<0)
        printf("不存在学号为%d的同学\n",key);
    else
        printf("学号为%d的同学的成绩是:%d\n",key,score[index]);
    return 0;
}
int readData(int a[],int b[])
{
    FILE *p;
    int i=0;
    p=fopen("score1.txt","r");
    if(p==NULL)
    {
        printf("File cannot open!\n");
        exit(0);
    }
    while(fscanf(p,"%d%d",&a[i],&b[i])!=EOF)
        i++;
    fclose(p);
    return i;
}
int search(int a[],int n,int key)
{
    int i,index=-1;
    for(i=0;i<n;i++)
    {
        if(a[i]==key)
        {
            index=i;
            break;
        }
    }
    return index;
}
运行结果:



(2)代码:
#include<stdio.h>
#include<stdlib.h>
int readData(int a[],int b[]);
void sort(int a[],int b[],int n);
int search(int a[],int n,int key);
int main()
{
    int num[200], score[200];
    int count;
    int index;
    int key;
    int start=1;
    count = readData(num, score);
    sort(num,score,count);
    while(start)
    {
        printf("请输入要查找的学生学号:");
        scanf("%d",&key);
        index = search(num,count,key);
        if(index<0)
            printf("不存在学号为%d的同学\n\n",key);
        else
            printf("学号为%d的同学的成绩是:%d\n\n", key, score[index]);
        printf("输入 1 继续,0 结束:");
        scanf("%d",&start);
    }
    return 0;
}
int readData(int a[],int b[])
{
    int i=0;
    FILE *fp;
    fp=fopen("score1.txt","r");
    if(fp==NULL)
    {
        printf("open file error!\n");
        exit(0);
    }
    while(fscanf(fp,"%d%d",&a[i],&b[i])!=EOF)
        i++;
    fclose(fp);
    return i;
}
void sort(int a[],int b[],int n)
{
    int i,j,k,t;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(a[k]>a[j])
                k=j;
        t=a[k];
        a[k]=a[i];
        a[i]=t;
        t=b[k];
        b[k]=b[i];
        b[i]=t;
    }
}
int search(int a[],int n,int key)
{
    int max,min,mid;
    int index=-1;
    min=0;
    max=n-1;
    do
    {
        mid=(max+min)/2;
        if(a[mid]==key)
        {
            index=mid;
            break;
        }
        else if(a[mid]>key)
            max=mid-1;
        else if(a[mid]<key)
            min=mid+1;
    }
    while(min<=max);
    return index;
}
运行结果:
第二十六课 实现线性表基本操作的函数 【项目1-4】_第5张图片





















你可能感兴趣的:(第二十六课 实现线性表基本操作的函数 【项目1-4】)