语言数据结构直接插入排序法输出后总有数据丢失,输出的是一个地址好像还是什么的东西,请问这是怎么回事呀
代码如下:
#include "stdio.h"
#include "stdlib.h"
#define SIZE 100
#define LT(a,b) ((a)<(b))
#define EQ(a,b) ((a)==(b))
#define OK 1
#define ERROR 0
#define MAX 20
typedef int InfoType;
typedef int KeyType;
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int stsize;
}SSTable;
int Init(SSTable &ST){//定义一个顺序表
ST.elem=(ElemType*)malloc(SIZE*sizeof(ElemType));
ST.length=0;
ST.stsize=SIZE;
return OK;
}
int Insert(SSTable &ST,int i,ElemType e){//初始化顺序表
ElemType *newbase,*p,*q;
if(i<1||i>ST.length+1)return ERROR;
if(ST.length>=ST.stsize){
newbase=(ElemType*)realloc(ST.elem,(ST.stsize+SIZE)*sizeof(ElemType));
if(!newbase)return ERROR;
ST.elem=newbase;
ST.stsize+=SIZE;
}
q=&(ST.elem[i-1]);
for(p=&(ST.elem[ST.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
ST.length++;
return OK;
}
void print(SSTable &ST){//打印函数1
ElemType *p;
p=ST.elem;
for(int i=0;i<ST.length;i++,p++)
{
printf("%d ",*p);
}
printf("\n");
}
void OutputTable(SSTable ST)//打印函数2
{
for (int i=1;i<=ST.length;i++)
printf("%d ",ST.elem[i]);
printf("\n");
}
int Search_Seq(SSTable ST,KeyType key){//顺序查找
ST.elem[0]=key;
int i;
for(i=ST.length;ST.elem[i]!=key;--i);
printf("%d",i);
if(i!=0){
printf("查找成功,查找了%d次",ST.length-i);
}
else if(i==0){
printf("查找失败");
}
return i;
}
void Zhijie(SSTable ST){//直接插入排序
for(int i=2;i<=ST.length;i++)//小于SS.length
{//i从2开始,1号位置用来比较
if(LT(ST.elem[i],ST.elem[i-1])){
ST.elem[0]=ST.elem[i];//复制为哨兵
//ST.elem[i]=ST.elem[i-1];
for(int j=i-1;LT(ST.elem[0],ST.elem[j]);j--)
{
ST.elem[j+1]=ST.elem[j];//将大于哨兵的数据往后移动一个
}
ST.elem[j+1]=ST.elem[0];//将哨兵赋到正确的位置
}
}
}
int Search_Bin(SSTable ST,KeyType key)//折半查找排序
{
int low,mid,high,count;
low=1;
high=ST.length;
count=0;
while(low<=high)
{
count++;
mid=(low+high)/2;
if(EQ(key,ST.elem[mid]))
{
printf("\n折半查找法查找成功,比较%d次\n",count);
return mid;
}
else if(LT(key,ST.elem[mid]))
high=mid-1;
else
low=mid+1;
}
printf("\n折半查找法查找失败!\n");
return 0;
}
void main(){
SSTable S;
ElemType e;
KeyType key;
int a[10];
printf("请输入查找表元素");
int i;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
Init(S);
for(i=0;i<10;i++)Insert(S,i+1,a[i]);
printf("查找表如下:");
print(S);
printf("\n");
printf("请输入要查找的元素");
scanf("%d",&e);
Search_Seq(S,e);
printf("===========================\n");
Zhijie(S);
printf("直接插入排序的结果为:");
OutputTable(S);
print(S);
printf("折半查找的结果为:");
Search_Bin(S,e);
}
```c
代码里面挺多问题的,给你修改了代码,可以试下,看能否满足你的需要,有问题可以私聊。
#include "stdio.h"
#include "stdlib.h"
#define SIZE 100
#define LT(a,b) ((a)<(b))
#define EQ(a,b) ((a)==(b))
#define OK 1
#define ERROR 0
#define MAX 20
typedef int InfoType;
typedef int KeyType;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int stsize;
}SSTable;
int Init(SSTable *ST){//定义一个顺序表
ST->elem=(ElemType*)malloc(SIZE*sizeof(ElemType));
ST->length=0;
ST->stsize=SIZE;
return OK;
}
int Insert(SSTable *ST,int i,ElemType e){//初始化顺序表
ElemType *newbase,*p,*q;
if(i<1||i>ST->length+1)return ERROR;
if(ST->length>=ST->stsize)
{
newbase=(ElemType*)realloc(ST->elem,(ST->stsize+SIZE)*sizeof(ElemType));
if(!newbase)return ERROR;
ST->elem=newbase;
ST->stsize+=SIZE;
}
q=&(ST->elem[i-1]);
for(p=&(ST->elem[ST->length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
ST->length++;
return OK;
}
void print(SSTable *ST){//打印函数1
ElemType *p;
p=ST->elem;
for(int i=0;i<ST->length;i++,p++)
{
printf("%d ",*p);
}
printf("\n");
}
void OutputTable(SSTable *ST)//打印函数2
{
for (int i=1;i<=ST->length;i++)
printf("%d ",ST->elem[i]);
printf("\n");
}
int Search_Seq(SSTable *ST,KeyType key){//顺序查找
ST->elem[0]=key;
int i;
for(i=ST->length;ST->elem[i]!=key;--i);
printf("%d",i);
if(i!=0)
{
printf("查找成功,查找了%d次",ST->length-i);
}
else if(i==0)
{
printf("查找失败");
}
return i;
}
void Zhijie(SSTable *ST)
{//直接插入排序
int i,j;
for(i=2;i<=ST->length;i++)//小于SS.length
{//i从2开始,1号位置用来比较
if(LT(ST->elem[i],ST->elem[i-1]))
{
ST->elem[0]=ST->elem[i];//复制为哨兵
//ST.elem[i]=ST.elem[i-1];
for(j=i-1;LT(ST->elem[0],ST->elem[j]);j--)
{
ST->elem[j+1]=ST->elem[j];//将大于哨兵的数据往后移动一个
}
ST->elem[j+1]=ST->elem[0];//将哨兵赋到正确的位置
}
}
}
int Search_Bin(SSTable *ST,KeyType key)//折半查找排序
{
int low,mid,high,count;
low=1;
high=ST->length;
count=0;
while(low<=high)
{
count++;
mid=(low+high)/2;
if(EQ(key,ST->elem[mid]))
{
printf("\n折半查找法查找成功,比较%d次\n",count);
return mid;
}
else if(LT(key,ST->elem[mid]))
high=mid-1;
else
low=mid+1;
}
printf("\n折半查找法查找失败!\n");
return 0;
}
void main(){
SSTable S;
ElemType e;
KeyType key;
int a[10];
printf("请输入查找表元素");
int i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
Init(&S);
for(i=0;i<10;i++)
Insert(&S,i+1,a[i]);
printf("查找表如下:");
print(&S);
printf("\n");
printf("请输入要查找的元素");
scanf("%d",&e);
Search_Seq(&S,e);
printf("===========================\n");
Zhijie(&S);
printf("直接插入排序的结果为:");
OutputTable(&S);
print(&S);
printf("折半查找的结果为:");
Search_Bin(&S,e);
}
sleep(1);/*睡眠1s*/
char *content;
content = malloc(20000);/*分配一片连续的内存*/
free(content);/*释放掉该指针指向的内存区域,与malloc对应使用*/
主程序:
//主程序:
if(clipbar_process(content)) /*提取并处理剪切板的数据到指定内存*/
{
set_clipboard(content);/*粘贴到剪切板*/
}
函数失效的来源--return 0;
if (!IsClipboardFormatAvailable(CF_TEXT))
return 0;
剪切板的格式
#ifndef NOCLIPBOARD
#define CF_TEXT 1
#define CF_BITMAP 2
#define CF_METAFILEPICT 3
#define CF_SYLK 4
#define CF_DIF 5
#define CF_TIFF 6
#define CF_OEMTEXT 7
#define CF_DIB 8
#define CF_PALETTE 9
#define CF_PENDATA 10
#define CF_RIFF 11
#define CF_WAVE 12
#define CF_UNICODETEXT 13
#define CF_ENHMETAFILE 14
#define CF_HDROP 15
#define CF_LOCALE 16
#define CF_DIBV5 17
#define CF_MAX 18
#define CF_OWNERDISPLAY 0x0080
#define CF_DSPTEXT 0x0081
#define CF_DSPBITMAP 0x0082
#define CF_DSPMETAFILEPICT 0x0083
#define CF_DSPENHMETAFILE 0x008E
#define CF_PRIVATEFIRST 0x0200
#define CF_PRIVATELAST 0x02FF
#define CF_GDIOBJFIRST 0x0300
#define CF_GDIOBJLAST 0x03FF
#endif
很抱歉,参考资料与问题不符,无法为您提供解决方案。请提供与问题相关的参考资料或更详细的问题描述。谢谢。
整体修改如下,改动处见注释,供参考:
#include "stdio.h"
#include "stdlib.h"
#define SIZE 100
#define LT(a,b) ((a)<(b))
#define EQ(a,b) ((a)==(b))
#define OK 1
#define ERROR 0
#define MAX 20
typedef int InfoType;
typedef int KeyType;
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int stsize;
}SSTable;
int Init(SSTable &ST){//定义一个顺序表
ST.elem=(ElemType*)malloc(SIZE*sizeof(ElemType));
ST.length=0;
ST.stsize=SIZE;
return OK;
}
int Insert(SSTable &ST,int i,ElemType e){//初始化顺序表
ElemType *newbase,*p,*q;
if(i<1||i>ST.length+1)return ERROR;
if(ST.length>=ST.stsize){
newbase=(ElemType*)realloc(ST.elem,(ST.stsize+SIZE)*sizeof(ElemType));
if(!newbase)return ERROR;
ST.elem=newbase;
ST.stsize+=SIZE;
}
q=&(ST.elem[i-1]);
for(p=&(ST.elem[ST.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
ST.length++;
return OK;
}
void print(SSTable &ST){//打印函数1
ElemType *p;
p=ST.elem;
for(int i=0;i<ST.length;i++,p++)
{
printf("%d ",*p);
}
printf("\n");
}
void OutputTable(SSTable ST)//打印函数2
{
for (int i=0;i < ST.length;i++)
//for (int i=1;i<=ST.length;i++) //修改
printf("%d ",ST.elem[i]);
printf("\n");
}
int Search_Seq(SSTable ST,KeyType key){//顺序查找
//ST.elem[0]=key; 修改
int i;
for(i=ST.length - 1;ST.elem[i]!=key;--i); //修改
if(i >= 0){ // if(i!=0) 修改
printf("位置:%d\n",i);
printf("查找成功,查找了%d次\n",ST.length-i);
return OK; //修改
}
else { // if(i==0){ 修改
printf("查找失败\n");
return ERROR; //return i; 修改
}
}
void Zhijie(SSTable ST){//直接插入排序
int i, j;
ElemType x;
for(i = 1;i < ST.length; i++)// for(i=2;i<=ST.length;i++) 修改
{
//if(LT(ST.elem[i],ST.elem[i-1])){ 修改
x = ST.elem[i]; //ST.elem[0]=ST.elem[i];//复制为哨兵 修改
//ST.elem[i]=ST.elem[i-1]; 修改
for(j = i;j > 0 && LT(x,ST.elem[j - 1]);j--)
//for(j=i-1;LT(ST.elem[0],ST.elem[j]);j--) 修改
{
ST.elem[j] = ST.elem[j - 1];//将大于哨兵的数据往后移动一个 修改
}
ST.elem[j] = x; //将哨兵赋到正确的位置 修改
}
//}修改
}
int Search_Bin(SSTable ST,KeyType key)//折半查找排序
{
int low,mid,high,count;
low=0; //low=1; 修改
high=ST.length - 1; //high=ST.length; 修改
count=0;
while(low<=high)
{
count++;
mid=(low+high)/2;
if(EQ(key,ST.elem[mid]))
{
printf("\n折半查找法查找成功,比较%d次\n",count);
return mid;
}
else if(LT(key,ST.elem[mid]))
high=mid-1;
else
low=mid+1;
}
printf("\n折半查找法查找失败!\n");
return 0;
}
void main(){
SSTable S;
ElemType e;
KeyType key;
int a[10];
printf("请输入查找表元素");
int i;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
Init(S);
for(i=0;i<10;i++)Insert(S,i+1,a[i]);
printf("查找表如下:");
print(S);
printf("\n");
printf("请输入要查找的元素");
scanf("%d",&e);
Search_Seq(S,e);
printf("===========================\n");
Zhijie(S);
printf("直接插入排序的结果为:");
OutputTable(S);
print(S);
printf("折半查找的结果为:");
Search_Bin(S,e);
}