諸位大佬可以幫我試運行一下看看為什么程式會中斷嗎,我連隨機種子都沒法輸入,好崩潰
/*#include <iostream.h>
#include <iomanip.h>*/
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int max=10000;
struct SqList
{
int elem[10000]; //存放元素的陣列
int length; //當前長度
};
void init(SqList &list);
void display(SqList &list);
void insert(SqList &list);
void search(SqList &list);
void del(SqList &list);
void simpleSort(SqList &list);
void quickSort(SqList &list);
void binarySearch(SqList &list);
void inverter(SqList &list);
void orderlyinserted(SqList &list);
void specifydelete(SqList &list);
void merge(SqList &LA,SqList &LB,SqList &LC);
SqList list,LA,LB,LC;//本人百度得出,線性表的順序實作結構體
int main()
{
char choice;
while (1)
{
//stem("cls");//本人百度出來的,“system("cls");的意思就是呼叫DOS下的清屏命令“cls”
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 ("\t\t 9:就地逆置 \n");
printf ("\t\t 10:有序插入 \n");
printf ("\t\t 11:洗掉順序表中元素值在 x到y(x和y自定)之間的所有元素 \n");
printf ("\t\t 12:實作將兩個非遞減的順序表進行合并 \n");
printf ("\n");
printf ("\t\t 0:退出 \n");
printf ("\n");
printf ("\t\t請選擇:" );
choice = getch();
switch(choice)//里面的這個選擇是前面定義的變數,也就是運算式。
{
case '1':
init(list);
break;
case '2':
display(list);
break;
case '3':
insert(list);
break;
case '4':
search(list);
break;
case '5':
del(list);
break;
case '6':
simpleSort(list);
break;
case '7':
quickSort(list);
break;
case '8':
binarySearch(list);
break;
case '0':
exit(0);
}
}
}
//對以下代碼提示,螢屏提示后,從鍵盤輸入線性表長度和(亂數種子)!!!,生成(指定長度)!!!的線性表list
void init(SqList &list)//順序表的初始化
{
int i;
while (1)
{
printf( "輸入元素個數(0-10000 ):" );
scanf("%d", list.length);
if (list.length >= 0 && list.length <= max) /*本人百度搜索得到的線性表初始化格式如下 ,因為此題有特殊要求所以看以來不大一樣
//初始化順序表
void InitList(PSeqList L)
{
if (L == NULL)話說這一步是什么意思,是等于空就沒有意義了是嗎?
{
return;
}
L->length = 0;
} */
break;
printf("\n");
}
while (1)
{
printf ("輸入亂數種子(0-32767):" );
scanf("%d",&i);
if (i >= 0 && i <= 32767)
break;
printf("\n");
}
srand(i); //指定亂數種子,相同的種子將產生相同的資料序列
rand();
for (i = 0; i < list.length; i++)
{
list.elem[i] = rand() % 10000;
}
for (i = list.length; i < max; i++)
list.elem[i] = 0;
}
//承接以下編碼內容,在螢屏上依次顯示線性表list中的元素個數和全部元素
//格式應便于觀察
//如果需要指定輸出的寬度,可以使用 cout << setw(W) << X ,其中 X 是輸出的數值,W 是占據的列數
void display(SqList &list)// 第一點顯示
{ int k;
printf("%d\n",list.length);
for (k = 0; k < list.length; k++)
{
printf("%-3d", list.elem[k]);
}
printf("\n");
}
//以下內容,螢屏提示后,從鍵盤輸入一個元素值,然后把這個新元素插到線性表list的!!末尾!!(親愛的朋友,你這一點沒有達成喲)
//應有溢位判斷和報告
void insert(SqList &list)//第二點,插入
{
int i,j;
printf("請輸入一個需要插入的元素值:");
scanf("%d",i);
/*if(i<1||i>list.length+1) //判斷插入位置是否有效,但是這道題是尾插
{
return false;
}*/
if (list.length == max)
{
printf("順序表已滿,不能插入!\n");
}
list.elem[list.length] = i;
list.length++;
}
//螢屏提示后,從鍵盤輸入一個元素值,在線性表list中搜索這個元素
//螢屏顯示搜索結果和搜索程序中的比較次數
void search(SqList &list)//第三點,查找
{
int i,e;
printf("請輸入一個需要查找的元素值:");
scanf("%d",e);
for(int i=0;i<list.length;i++)
{
if(list.elem[i]==e)
printf("list.elem[%d]=%d",i,e);
printf(" %d",i+1);
}
}
//螢屏提示后,從鍵盤輸入一個元素值,在線性表list中洗掉這個元素!!
//螢屏顯示洗掉成功與否的資訊,并顯示比較次數和移動次數
void del(SqList &list)//第四點,洗掉
{
int i,j,count;
printf("請輸入一個需要洗掉的元素值:");
scanf("%d",i);
count=0;
if(i<1||i>list.length) ; //洗掉位置有誤
for(int j=i;j<list.length;j++)
{
list.elem[j-1]=list.elem[j];
count++; //前移元素
}
list.length--;
printf("移動次數:%d",count);
printf("\n");
printf("比較次數:%d",i);
}
//對線性表list進行簡單排序
//螢屏顯示比較次數和移動次數
void simpleSort(SqList &list)//第五點,簡單排序
{
int m = list.length - 1;
int flag = 1;
int i,j,t,count;
count=0; //flag用來標記某一趟排序是否發生交換
while((m > 0) && (flag == 1))
{
flag=0; //flag置為0,如果本趟排序沒有發生交換,則不會執行下一趟排序
for(j = 1; j <=m ; j++)
{
if(list.elem[j] > list.elem[j+1])
{
flag = 1; //flag置為1,表示本趟排序發生了交換
t = list.elem[j]; list.elem[j] = list.elem[j+1]; list.elem[j+1] = t; //交換前后兩個記錄
}
--m;
count++;//交換了之后最大的已經排到后面了,所以減去一是為了減少計算量
}
}
printf("比較次數和移動次數均為:%d",count);
}
//對線性表list進行快速排序
//螢屏顯示比較次數和移動次數
void quickSort(SqList &list)//)第五點,快速排序
{
int count=0,low,high;
list.elem[0] = list.elem[low]; //用子表的第一個記錄作樞軸記錄,假設最低等于0
list.elem[list.length] = list.elem[high];
int pivotkey = list.elem[low]; //樞軸記錄關鍵字,有一個自創詞語叫做樞軸關鍵字
while (low < high) { //從表的兩端向中間掃描
count++;
while (low < high && list.elem[high]>= pivotkey)
--high;
list.elem[low] = list.elem[high]; //將比樞軸小的記錄移動到低端
while (low < high && list.elem[low] <= pivotkey)
++low;
list.elem[high] = list.elem[low]; //將比樞軸大的記錄移動到高端
}
list.elem[low] = list.elem[0]; //樞軸記錄到位
printf("比較次數和移動次數均為:%d",count);
}
//螢屏提示后,從鍵盤輸入一個元素值,對經過排序的線性表list進行折半查找
//螢屏顯示查找結果,并顯示比較次數
void binarySearch(SqList &list)//第六點,折半查找
{
int key,i,j,temp;
if (list.length == 0)printf("順序表為空");
for(int i=0;i<list.length;i++){
for(int j=i+1;j<list.length;j++){
if(list.elem[i]>list.elem[j])
temp=list.elem[j];
list.elem[j]=list.elem[i];
list.elem[i]=temp;
}
}
if(key<list.elem[0]||key>list.elem[list.length])printf("恭喜您已經找到了,該元素所在位置為:查無此數");
printf("比較次數為:0");
int l = 0, h = list.length, midst,count=0;
while(l <= h){
midst = (l + h) / 2;
if(key == list.elem[midst]){
printf("恭喜您已經找到了,該元素所在位置為:第%d位",midst);
}
else if(list.elem[midst] > key){
h = midst - 1;
}
else{
l = midst + 1;
}
count++;
}
}
void inverter(SqList &list){//就地逆置
int i,j,temp,k;
int l = 0, h = list.length, midst;
midst = (l + h) / 2;
if (list.length == 0)printf("順序表為空");
for(int i=0;i<midst;i++){
for(int j=list.length;j>midst;j--){
if(list.elem[i]>list.elem[j])
temp=list.elem[j];
list.elem[j]=list.elem[i];
list.elem[i]=temp;
}
for(k=0;k<list.elem[h];k++)printf("%d ",list.elem[k]);
}
}
void orderlyinserted(SqList &list){//有序插入
int i,j,temp,k,a;
scanf("%d",k);
if (list.length == 0)printf("順序表為空");
for(int i=0;i<list.length;i++){
for(int j=i+1;j<list.length;j++){
if(list.elem[i]>list.elem[j])
temp=list.elem[j];
list.elem[j]=list.elem[i];
list.elem[i]=temp;
}
}
//判斷順序表是否已滿
if (list.length >= max)
{
printf("順序表已滿,不能插入!\n");
}
else
{
for (a = 0; a<= list.length; a--)
{
if(k>=list.elem[a-1]&&(k<=list.elem[a]))
list.elem[a + 1] = list.elem[a];//前面的等于后面的,相當于向后移了一位
printf("插入元素后的資料表為:%d",list.elem[a]);
}
list.length++; //資料表的長度加1
}
}
void specifydelete(SqList &list){//指定洗掉
int x,y,i;
if(x<0||y>list.length)printf("無效洗掉");
else {
for(i=y;i<=2*y-x;i++){
list.elem[i-(y-x+1)]=list.elem[i];}//用7、8、9、10、11元素分別覆寫2、3、4、5、6;
}
list.length-=y-x+1;//順序表長度減x,y之間的元素
}
void merge(SqList &LA,SqList &LB,SqList &LC)
{
int i, j, k;
i = 0; j = 0; k = 0;
while (i < LA.length && j < LB.length)
{
if (LA.elem[i] <= LB.elem[j])
{
LC.elem[k] = LA.elem[i];//小的先放
i++; k++;
}
else
{
LC.elem[k] = LB.elem[j];
j++; k++;
}
}
//當表LA比表LB長時,將表LA剩下的元素賦給表LC
while (i < LA.length)
{
LC.elem[k] = LA.elem[i];
i++; k++;
}
while (j < LB.length)
{
LC.elem[k] = LB.elem[j];
j++; k++;
}
LC.length = LA.length + LB.length;
}
//7.編程實作一個順序表的就地逆置,即利用原表的存盤空間將順序表逆置;
// 8、順序表有序插入(顯示比較次數、移動次數),
//螢屏提示后,從鍵盤輸入一個元素值,在經過排序的線性表中插入這個元素;
//螢屏顯示比較次數和移動次數,應有溢位判斷和報告;
// 9、要求以較高的效率實作洗掉順序表中元素值在 x到y(x和y自定)之間的所有元素;
//10、編程實作將兩個非遞減的順序表進行合并,要求同樣的資料元素只出現一次;
//*11、編程實作順序表的shell排序(步長為5,3,1);
// *12、編程實作堆排序演算法;
// *13、利用三元組順序表存盤矩陣,實作矩陣的轉置(請獨立寫程式實作)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/48123.html
標籤:C語言
上一篇:error LNK2019: 無法決議的外部符號 "void __cdecl Init(void)" (?Init@@YAXXZ),該符號在函式 _main 中
下一篇:令人絕望的順序表,糾錯糾了一天
