归并排序-数据结构C语言顺序表的排序和删除问题

问题描述

数据结构C语言顺序表的排序和删除问题

顺序表定义的长度为10000,此时程序可以正常运行;把顺序表长度改成500000,程序出错,不能运行。求问大神是哪里出了错误,还是要提高存储上限?如何改正?#include
#include
#include
typedef int ElemType;
#define MAX 10000
typedef struct{
ElemType *elem;
int length;
}SqList;

void InitList(SqList &L){
L.elem = (ElemType *)malloc(MAX*sizeof(ElemType));
free(L.elem);
L.elem = (ElemType *)malloc(MAX*sizeof(ElemType));
L.length = MAX;
}//初始化顺序表

void Merge(ElemType SR[],ElemType TR[],int i,int m ,int n){
int j,k;
for(j=m+1,k=i;i<=m&&j<=n;k++){
if(SR[i]<=SR[j])
TR[k]=SR[i++];
else TR[k] = SR[j++];
}
while(i<=m) TR[k++] = SR[i++];
while(j<=n) TR[k++] = SR[j++];
}// 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
void Msort( ElemType SR[], ElemType TR1[], int s, int t ){
int k;
ElemType TR2[MAX];
if(s==t) TR1[s] = SR[s];
else
{
k = (s+t)/2;
Msort(SR,TR2,s,k);
Msort(SR,TR2,k+1,t);
Merge(TR2,TR1,s,k,t);
}
}// 对SR[s..t]进行归并排序,排序后的记录存入TR1[s..t]
void SelectSort(SqList &L){
int i,j,k;
ElemType temp;
int n=L.length;
for(i=1;i<n;i++){
k = i;
for(j=i+1;j<=n;j++)
if(L.elem[j]<L.elem[k])
k=j;
if(i!=k){
temp = L.elem[i];
L.elem[i] = L.elem[k];
L.elem[k] = temp;
}
}
}//简单选择排序的实现

int QKPass(ElemType s[],int left,int right){
ElemType x = s[left];
while(left
while(left=x){
right--;
}
if(left
s[left] = s[right];
left++;
}
while(left
left++;
}
if(left
s[right] = s[left];
right--;
}
}
s[left] = x;
return left;
}//一趟快速排序算法
void HeapAdjust (SqList &H, int s, int m){
H.elem[0] = H.elem[s];
int j;
H.elem[0] = H.elem[s];
for(j = 2*s ; j
if(j
j++;
if(H.elem[0]>=H.elem[j])
break;
H.elem[s] = H.elem[j];
s = j;
}
H.elem[s] = H.elem[0];
}//保存大顶堆的根元素后,对大顶堆的调整
void HeapSort (SqList &H){
int i ;
ElemType temp;
for(i=H.length/2;i>1;i--)
HeapAdjust(H,i,H.length);
temp = H.elem[0];
H.elem[0] = H.elem[H.length];
H.elem[H.length] = temp;
for(i = H.length-1;i>1;i--){
HeapAdjust(H,1,i);
temp = H.elem[1];
H.elem[1] = H.elem[i];
H.elem[i] = temp;
}
}//建立大顶堆,实现堆排序

void BubbleSort(SqList &L){
int n = L.length,change = 1;
int i,j;
ElemType temp;
for(i=1;i
change = 0;
for(j=1;j
if(L.elem[i]>L.elem[j]){
temp = L.elem[i];
L.elem[i] = L.elem[j];
L.elem[j] = temp;
change = 1;
}
}
}//冒泡排序算法实现

void QKsort(ElemType s[],int low,int high){
int pos;
if(low<high){
pos = QKPass(s,low,high);
QKsort(s,low,pos-1);
QKsort(s,pos+1,high);
}
}//递归实现快序排序
void DeleteItem(SqList &L,ElemType item){
int i;
for(i=1;i<L.length;i++)
if(L.elem[i]==item){
L.elem[i] = L.elem[--L.length];
free(&L.elem[L.length]);
}
}//删除与item相同元素

int main(){
double t1,t2;
int i;
SqList L1,L2;
int k;
printf("**************************************
");
printf("0、退出
");
printf("1、二路归并排序
");
printf("2、堆排序
");
printf("3、冒泡排序
");
printf("4、快速排序
");
printf("5、直接插入排序
");
printf("6、删除与Item相同元素
");
printf("**************************************
");
do{
InitList(L1);
InitList(L2);
scanf("%d",&k);
for(i=1;i<L1.length;i++)
L1.elem[i] = rand()%MAX;
for(i=1;i<L2.length;i++)
L2.elem[i]=i;
switch(k){
case 0:break;
case 1:
printf("
********二路归并排序******
");
t1=clock();
Msort(L1.elem,L1.elem,1,L1.length-1);
t1 = clock() - t1;
t2=clock();
Msort(L2.elem,L2.elem,1,L2.length-1);
t2 = clock()- t2;

        break;
        case 2:
        printf("
**********堆排序*********
");
        t1=clock();
        HeapSort(L1);
        t1 = clock() - t1;
        t2=clock();
        HeapSort(L2);
        t2=clock() - t2;

        break;
        case 3:
        printf("
*********冒泡排序********
");
        t1=clock();
        BubbleSort(L1);
        t1 = clock() - t1;
        t2=clock();
        BubbleSort(L2);
        t2=clock() - t2;

        break;
    case 4:
        printf("
*********快速排序********
");
        t1=clock();
        QKsort(L1.elem,1,L1.length-1);
        t1 = clock() - t1;
        t2=clock();
        QKsort(L2.elem,1,L2.length-1);
        t2=clock() - t2;

        break;

    case 5:
        printf("
********直接插入排序******
");
        t1=clock();
        SelectSort(L1);
        t1 = clock() - t1;
        t2=clock();
        SelectSort(L2);
        t2=clock() - t2;
        break;
    case 6:
        t1=clock();
        DeleteItem(L1,5);
        t1=clock()-t1;
        for(i=1;i<L1.length;i++)
            printf("%d ",L1.elem[i]);
        break;
    default :
        printf("
输入错误!

");
}
if(0<k&&k<6){
    printf("
该排序无序表排序时间:%f毫秒
",(double)t1);
    printf("
该排序有序表排序时间:%f毫秒

",(double)t2);
}
else if(k==6) printf("
删除元素的时间为%f毫秒
",(double)t1);
}while(k!=0);

return 0;

}

解决方案

你应该把变量定义成指针,用new/malloc在堆上分配。堆栈上的内存有限,一般只有几MB,超过了就堆栈溢出了。

解决方案二:

数据结构c语言版之顺序表的删除
c语言_数据结构_顺序表
C语言数据结构-顺序表

时间: 2024-08-31 15:24:37

归并排序-数据结构C语言顺序表的排序和删除问题的相关文章

数据结构 c++语言-顺序表上的基本操作实现

问题描述 顺序表上的基本操作实现 求大神补充一下逆置操作,顺便将注释补上.求问此处return -1:是什么意思?顺序表上的基本操作实现 时 限: 1000 ms 内存限制: 10000 K 总时限: 3000 ms 描述: 在顺序存储结构实现基本操作:初始化.创建.插入.删除.查找.遍历.逆置.合并运算. 输入: 请输入线性表La的长度:na1 a2 a3 ...an(数值有序,为降序)请输入要插入到线性表La中的数字x和插入的位置i:x i请输入要删除数字的位置:i请输入要查找的数字:x请输

C语言顺序表基本操作,刚学数据结构还不懂怎么操作?求助!!

问题描述 C语言顺序表基本操作,刚学数据结构还不懂怎么操作?求助!! 1.建立一个顺序表,要求从键盘输入10个整数,并将该顺序表的元素从屏幕显示出来. 2.用函数实现在顺序表中查找其中一个元素,如果找到,返回该元素在顺序表中的位置和该元素的值,否则提示无此元素. 3.用函数实现顺序表的插入和删除操作.由用户输入待插入元素及插入位置,将完成插入后的顺序表输出:由用户输入删除第几个元素,将完成删除后的顺序表输出. 解决方案 http://zhidao.baidu.com/link?url=n-XCi

【数据结构1】顺序表

顺序表的基本概念 1 静态存储 2 动态存储 顺序表的基本操作 1 插入操作 2 删除操作 3 查找操作 4 顺序表并集 5 顺序表合并 1 顺序表的基本概念 顺序存储的线性表称为顺序表.表中元素的逻辑顺序与物理顺序相同. 假设顺序表L存储的起始位置是b,每个数据元素所占用存储空间大小是l,则表L所对应的顺序存储如下图.(本文规定:顺序表元素位序从1开始,而数组元素下标从0开始) 顺序表中元素的一维数组可以是静态分配,也可以是动态分配. 1.1 静态存储 在静态分配时,由于数组的大小和空间已经固

C++数据结构分别用顺序表和单链表的存储形式

问题描述 C++数据结构分别用顺序表和单链表的存储形式 分别用顺序表和单链表的存储形式实现将输入的两个大整数(超过20位)相加并打印和值:自行设计基本操作,要求两种存储结构中操作接口相同 解决方案 数据结构-----顺序表与单链表的实现 解决方案二: 存储结构的引入是为了将大数字分解成若干个小数字么? 解决方案三: 大数相加必须,分解成若单个小数字呀,采用哪个储存结构只是题目要求而已,用数组也可以实现代码如下#include #include int main() { char str1[100

c语言顺序表-菜鸟求救,这个程序,做ACM题目时两个pass,三个错了,提示是unknown error。。。

问题描述 菜鸟求救,这个程序,做ACM题目时两个pass,三个错了,提示是unknown error... #include #include #include #define MAXSIZE 1000 static int h[MAXSIZE]; int k = 0, x=0; typedef int datatype; typedef struct { datatype a[MAXSIZE]; int size; }seq_list; void init(seq_list *L) { L->

数据结构实践——初始化顺序表怎么就内存溢出了?

有学生调程序,是要建顺序表. 他的程序是这样的: #include <stdio.h> #include <malloc.h> #define MaxSize 50 //Maxsize将用于后面定义存储空间的大小 typedef int ElemType; //ElemType在不同场合可以根据问题的需要确定,在此取简单的int typedef struct { ElemType data[MaxSize]; //利用了前面MaxSize和ElemType的定义 int lengt

数据结构(C#):顺序表

线性表是有限个数据元素的序列.线性表的存储有顺序存储和链式存储两种. 为使线性表支持相同的API,定义了以下接口,分别用顺表和链表实现. /* * File : ILinerList.cs * Author : Zhenxing Zhou * Date : 2008-12-06 * Blog : http://www.xianfen.net/ */ using System.Collections.Generic; namespace Xianfen.Net.DataStructure { in

关于c语言实现动态顺序表的插入删除

问题描述 关于c语言实现动态顺序表的插入删除 3C #include ""stdafx.h""#includeconst int MAXSIZE = 10;typedef struct{ int *elem; int length; int maxsize;}sqlist;void initList(sqlist *L){ L->elem = (int *)malloc(L->maxsize*sizeof(int)); if (!L->elem)

C语言实现顺序表基本操作汇总_C 语言

本文汇总了C语言下实现及操作顺序表的方法,对于学习数据结构的朋友来说是一个不错的参考程序.完整代码如下: #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int status ;