欢迎光临散文网 会员登陆 & 注册

1

2023-09-06 16:24 作者:口袋袋errrrrrrrrr  | 我要投稿

/*

源文件名:P1.cpp

功能:顺序表操作

*/

#include <conio.h>

#include <stdio.h>

#include <string.h>

#include <math.h>

#include <stdlib.h>

#include <iostream>


#define max 10000


struct SqList

{

int data[max];         //存放元素的数组

int length;            //当前长度

};


void init(SqList &list);

void display(SqList &list);

void insert(SqList &list,int,int);

void search(SqList &list,int);

void del(SqList &list,int);

void simpleSort(SqList &list);

void binarySearch(SqList &list,int);

void nzlist(SqList &list);


SqList list;


int main()

{

char choice;

int key;


while (1)

{

system("cls");

printf("     学号: ****     姓名:***            \n "); 

printf("\n\n\n\n");                             

printf("\t\t             顺序表操作  \n");

printf("\t\t======================================");

printf("\n\n");

printf("\t\t             1:初始化       \n");

printf("\t\t             2:显示         \n");

printf("\t\t             3:单个插入     \n");

printf("\t\t             4:查找         \n");

printf("\t\t             5:删除         \n");

printf("\t\t             6:简单选择排序 \n");

printf("\t\t             7:折半查找     \n");

printf("\t\t             8:逆置线性表   \n");

printf("\n");

printf("\t\t             0:退出         \n");

printf("\n");

printf("\t\t请选择:");


choice = getch();

system("cls");

switch(choice)

{

case '1':

void init(SqList &list);

break;

case '2':

void display(SqList &list);

break;

case '3':

int wz; //在wz出插入key

void insert(SqList &list,int,int);

break;

case '4':

printf("输入你要查找到值(数字)\n" );

            scanf("%d",&key);

void search(SqList &list,int);

break;

case '5':

printf("输入你要删除的值(数字)\n" );

            scanf("%d",&key);

void del(SqList &list,int);

break;

case '6':

void simpleSort(SqList &list);

break;

case '7':

                printf("输入你要二分查找的值(数字)\n" );

            scanf("%d",&key);

    void binarySearch(SqList &list,int);

break;

case '8':

                void nzlist(SqList &list);

break;

case '0':

exit(0);

}

}

return 0;

}




//屏幕提示后,从键盘输入线性表长度和随机数种子,生成指定长度的线性表list

void init(SqList &list)

{

int i;

while (1)

{

printf("输入元素个数(0 - %d ):\n",max);

scanf("%d",&list.length);

if (list.length >= 0 && list.length <= max)

break;

printf("\n");

}

while (1)

{     

printf("输入随机数种子(0-32767):\n");

scanf("%d",&i);

if (i >= 0 && i <= 32767)

break;

printf("\n");

}

srand(i);  //指定随机数种子,相同的种子将产生相同的数据序列

rand();


for (i = 0; i < list.length; i++)

{

list.data[i] = rand() % 10000;

}

for (i = list.length; i < max; i++)

list.data[i] = 0;

}


// 注意:部分算法的函数定义如下,其他需自行不全 


//1.在屏幕上依次显示线性表list中的元素个数和全部元素

void display(SqList &list)

{int i;

for(i=0;i<list.length;i++)

{printf("[%5d]= %6d\n",(i+1),list.data[i]);}

puts("press 1 to continue");

   while(scanf("%d",&i )!=1);

}


//2.屏幕提示后,从键盘输入需要插入的位置wz和元素值key

void insert(SqList &list,int wz,int key)

{

SqList *L;

printf("输入要插入元素的位置:\n");

scanf("%d",&wz);

printf("输入要插入的数据元素的值:\n");

scanf("%d",&key);

if(wz<1||wz>L->length+1){

printf("输入的位置不在范围内!\n");

}

wz--;

int j;

for (j=L->length;j>wz;j--)

    list.data[j]=list.data[j-1];

list.data[wz]=key;

L->length++;

    puts("press 1 to continue");

    while(scanf("%d",&wz )!=1);

  

}


//3.屏幕提示后,在线性表list中搜索这个元素key,若存在该元素,则给出位置信息,

//  否则,显示“不存在此数!”

//屏幕显示搜索结果和搜索过程中的比较次数

void search(SqList &list,int key)

int i;

int flag=0;

for(i=0;i<list.length;i++){

if(list.data[i]==key)break;

flag++;

}

if( (i==list.length)&&(list.data[i]!=key)) printf("不存在此数!\n" );

else printf("[%5d]= %6d\n",(i+1),list.data[i]);

printf("查找次数:%d\n",flag );

puts("press 1 to continue");

while(scanf("%d",&i )!=1);

}

//4.屏幕提示后,在线性表list中删除这个元素key,并显示相关信息

//屏幕显示删除成功与否的信息,并显示比较次数和移动次数

void del(SqList &list,int key)

{

 int i;

     int flag=0;

for(i=0;i<list.length;i++){

if(list.data[i]==key)break;

flag++;

}

if( (i==list.length)&&(list.data[i]!=key)) printf("不存在此数!\n" );//查找 

else {

printf("[%5d]= %6d\n",(i+1),list.data[i]);

for(i=0;(i+1)<list.length;i++){

list.data[i]=list.data[i+1];

}

list.length--;

printf("删除成功!\n" );

}

puts("press 1 to continue");

while(scanf("%d",&i )!=1);

}

//5.编程实现一个顺序表的就地逆置,即利用原表的存储空间将顺序表逆置。

void nzlist(SqList &list)

{

  int i;

for(i=0;i<list.length/2;i++){

list.data[i] += list.data[list.length-i-1];//i是总和

list.data[list.length-i-1] = list.data[i]-list.data[list.length-i-1];//尾部变成原来的i

list.data[i] -= list.data[list.length-i-1];//头部变成原来的list.data[list.length-i-1]

}

for(i=0;i<20;i++)

    printf("就地逆置完成!  ");

}



//其他函数实现,请自行补充 

//6.简单选择排序 

void simpleSort(SqList &list)

{

int i,j,times=0,swaps=0,t;

printf("排序如下:\n" );

for(i=0;i<list.length;i++)

  {for(j=i;j<list.length;j++){

    times++;

    if(list.data[i]>list.data[j]){

      swaps++;

  t=list.data[i];

      list.data[i]=list.data[j];

      list.data[j]=t;

    }

  }}

 

  printf("比较次数:%d\n移动次数:%d",times,swaps );

  puts("press 1 to continue");

  while(scanf("%d",&i )!=1);

 } 

 //7.折半查找 

 void binarySearch(SqList &list,int key)

 {

  int times=0;

  int mid,low=0,high=list.length-1;

 

    while(low<=high){

    times++;

      if(list.data[low]==key){

        printf("[%d]%d,查找次数为:%d",low,list.data[low],times );

        break;}

      if(list.data[high]==key){

        printf("[%d]%d,查找次数为:%d",high,list.data[high],times );

        break;

      }

    mid=(low+high)/2;

    if(list.data[mid]==key){

      printf("[%d]%d,查找次数为:%d",mid,list.data[mid],times );

      break;

    }

    if(list.data[mid]>key)high=mid-1;

    if(list.data[mid]<key)low=mid+1;

    }

    if(low>high)printf("没有找到,查找次数为:%d\n",times );

int i;

    puts("press 1 to continue");

while(scanf("%d",&i )!=1);

}


1的评论 (共 条)

分享到微博请遵守国家法律