数据结构直接插入排序打印错误怎么回事

语言数据结构直接插入排序法输出后总有数据丢失,输出的是一个地址好像还是什么的东西,请问这是怎么回事呀
代码如下:

#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);
 
}

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7433421
  • 这篇博客也不错, 你可以看下【蓝桥杯】单片机程序中的一些易错点和注意事项
  • 除此之外, 这篇博客: C语言学习:除去剪切板内容的换行与回车中的 程序注意事项 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 文本内容需要添加结束符 '\0' , ASCLL码值为0;
    2. 关于睡眠,作者原本使用 usleep(500);  用以让系统睡眠0.5s(文中代码是 sleep(1); 睡眠1s),可是作者发现程序运行时CPU使用率达到50%,而使用 sleep(1);  时CPU占用率只有10%不到;
      		sleep(1);/*睡眠1s*/
    3. 作者在源码使用分配内存的方式提供复制剪切板的缓存,而不是直接使用数组作为缓存,因为作者想玩,想绕远路罢了;
      	char *content;
      	content = malloc(20000);/*分配一片连续的内存*/
      	free(content);/*释放掉该指针指向的内存区域,与malloc对应使用*/
    4. 注意剪切板有多种不同的格式,可以在头文件中看到,因此代码在分析剪切板的时候数据格式不对,相关函数就不会执行,相当于跳过,借此特性作为条件判断可以达到只对文本操作的目的,而对图片等其他格式没有影响

    主程序:

    //主程序:
    		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

  • 您还可以看一下 王志东老师的单片机应用之技能进阶课程中的 单片机内置上电复位功能的应用注意事项小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    很抱歉,参考资料与问题不符,无法为您提供解决方案。请提供与问题相关的参考资料或更详细的问题描述。谢谢。

整体修改如下,改动处见注释,供参考:

#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);
}