标题:错在哪里?求大佬指出
只看楼主
桔梗老板
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2019-3-25
结帖率:100%
已结贴  问题点数:10 回复次数:16 
错在哪里?求大佬指出
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
#define ERROR -1
#define OVEREFLOW -2
#define true 1
#define false 0
#define bool int
typedef int ElemType;
typedef struct sqlist
{
    
    ElemType data[maxsize];
    int length;
    
}sqlist,*Sqlist;

//初始化线性表
void InitList (Sqlist L)
{
    
    int i;
    L=(Sqlist)malloc(sizeof(sqlist));
    L->length=0;
    for(i=0;i<maxsize;i++)
    {
        L->data[i]=0;//初始化顺序表中的值,赋值为0 
    }
}

//创建一个顺序表
void CreateList (Sqlist L) 
{ 
    int i,j;
    L->length=0;//1111111
    printf("请问您想输入几个数字:");
    scanf("%d",&i);
    if(i<1||i>maxsize)
    {
        printf("输入有误\r\n");
         
     } 
     else
     {
         for(j=0;j<i;j++)
         {
             int num;
             
             printf("请输入一个数字"); 
             scanf("%d",&num);
             L->data[j]=num;
             ++L->length;  
             
         }
     }

 } 
   
   //遍历整个表
  void DispList(Sqlist L)
  {
      int i; 
      printf("\r\n*************整个表的值***********\r\n");
      for( i=0;i<L->length;i++)
      printf("第%d个数的值为%d\r\n",i+1,L->data[i]); 
      printf("\r\n****************\r\n");
      
   } 
   
   int main()
   {
       sqlist L; 
       int length; 
       printf("----初始化一个顺序表----\r\n"); 
       InitList(&L);
       printf("----建立一个顺序表----\r\n");
       CreateList(&L);
       DispList(&L); 
    return 0;
   }


程序代码:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
#define ERROR -1
#define OVEREFLOW -2
#define true 1
#define false 0
#define bool int
typedef int ElemType;
typedef struct sqlist
{
    
    ElemType data[maxsize];
    int length;
    
}sqlist,*Sqlist;

//初始化线性表
void InitList (Sqlist &L)
{
    
    int i;
    L=(Sqlist )malloc(sizeof(sqlist));
    L->length=0;
    for(i=0;i<maxsize;i++)
    {
        L->data[i]=0;//初始化顺序表中的值,赋值为0 
    }
}

//创建一个顺序表
void CreateList (Sqlist &L) //这里的&不能省 
{ 
    int i,j;
    printf("请问您想输入几个数字:");
    scanf("%d",&i);
    if(i<1||i>maxsize)
    {
        printf("输入有误\r\n");
         
     } 
     else
     {
         for(j=0;j<i;j++)
         {
             int num;
             printf("请输入一个数字"); 
             scanf("%d",&num);
             L->data[j]=num;
             L->length++;
             
         }
     }

 } 
   
   //遍历整个表
  void DispList(Sqlist L)
  {
      printf("\r\n*************整个表的值***********\r\n");
      for(int i=0;i<L->length;i++)
      printf("第%d个数的值为%d\r\n",i+1,L->data[i]);
      printf("\r\n****************\r\n");
      
   } 
   
   int main()
   {
       Sqlist L; 
       int length; 
       printf("----初始化一个顺序表----\r\n"); 
       InitList(L);
       printf("----建立一个顺序表----\r\n");
       CreateList(L);
       DispList(L);
    return 0;
   }


这两个程序的区别只有形参的类型和传入的实参不同 还有一句我在第一个程序注释为11111的代码,在第二个程序里没有
有这一句

没有这一句

我想知道为什么没有这一句会输出第四个数????
第二个程序有这个没这个都正常
搜索更多相关主题的帖子: define int data length printf 
2019-04-11 19:18
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
得分:6 
//在这句之前输出L->length,看是否为0,我想肯定不是0
L->length=0;//1111111
2019-04-11 22:04
ZJYTY
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:92
专家分:700
注 册:2018-12-20
得分:4 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
#define ERROR -1
#define OVEREFLOW -2
#define true 1
#define false 0
#define bool int
typedef int ElemType;
typedef struct sqlist
{

    ElemType data[maxsize];
    int length;

}sqlist,*Sqlist;

//初始化线性表
void InitList (Sqlist L)
{

    printf("addr = %p\n",L);                       //地址对比
    int i;
    L=(Sqlist)malloc(sizeof(sqlist));
    L->length=0;
    for(i=0;i<maxsize;i++)
    {
        L->data[i]=0;//初始化顺序表中的值,赋值为0 
    }
    printf("addr = %p\n",L);                    //地址对比

    /*L->length = 0;
    for(int i=0;i<maxsize;i++)
    {
        L->data[i]=0;//初始化顺序表中的值,赋值为0 
    }*/

}

//创建一个顺序表
void CreateList (Sqlist L) 
{ 
    int i,j;
//    L->length=0;//1111111
    printf("请问您想输入几个数字:");
    scanf("%d",&i);
    if(i<1||i>maxsize)
    {
        printf("输入有误\r\n");

    } 
    else
    {
        for(j=0;j<i;j++)
        {
            int num;

            printf("请输入一个数字"); 
            scanf("%d",&num);
            L->data[j]=num;
            ++L->length;  

        }
    }
} 

//遍历整个表
void DispList(Sqlist L)
{
    int i; 
    printf("\r\n*************整个表的值***********\r\n");
    for( i=0;i<L->length;i++)
        printf("第%d个数的值为%d\r\n",i+1,L->data[i]); 
    printf("\r\n****************\r\n");

} 

int main()
{
    sqlist L; 
    int length; 
    printf("----初始化一个顺序表----\r\n"); 
    InitList(&L);
    printf("lenth = %d,addr = %p\n",L.length,&L);                  //打印一下地址以及初始化后的length
    printf("----建立一个顺序表----\r\n");
    CreateList(&L);
    DispList(&L); 
    return 0;
}


会发现mallco后进行的初始化并不是传进来的地址,可改为下方注释代码

-------------------------------若有不当之处,敬请谅解-------------------------------
2019-04-11 22:13
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
得分:0 
sqlist L;   //已经在栈里面分配了空间,不需要利用malloc在堆里分配空间,此时L.length应该是一个随机值
InitList(&L);   //你把L的地址传过去,在InitList里面的L是一个新的变量,指向外面那个L的位置,如果你对L重新分配空间,即L指向新的位置,和外面那个L就没有半毛钱关系,再怎么变都不会影响外面那个L的值
void InitList (Sqlist L)
{
    L=(Sqlist)malloc(sizeof(sqlist));
}

Sqlist L;   //定义一个指针变量,并没有分配空间
InitList(L);   //InitList (Sqlist &L)是传L的引用,函数里面的L和外面的L是同一个东西,当分配了空间之后,外面的L也指向这个空间,所以改变函数里面的L是有意义的
void InitList (Sqlist &L)
{
    L=(Sqlist )malloc(sizeof(sqlist));
}
2019-04-11 22:14
桔梗老板
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2019-3-25
得分:0 
回复 2楼 word123
是的 输出来是1 感谢你的回答
2019-04-11 23:40
桔梗老板
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2019-3-25
得分:0 
回复 3楼 ZJYTY
谢谢 之前都没有想过要输出地址看在内存中的分布 那你可以再帮我看一下下面这个程序吗
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define  OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
//========线性表的动态分配顺序存储结构 =========
#define LIST_INIT_SIZE 5   //线性表存储空间的初始分配量 
#define  LISTINCREMENT 1   //线性表存储空间的分配增量 
typedef struct {
    int  *elem;//存储空间基址                
    int length;//当前长度
    int listsize;//当前分配的存储容量(以sizeof (ElemType)为单位)

} Sqlist;

//=======初始化线性表=========
Status InitList(Sqlist *L) {

    //构造一个空的线性表

    L->elem=(int *)malloc (LIST_INIT_SIZE*sizeof(int));
    if(!L->elem) {

        return OVERFLOW;//存储分配失败

    }
    L->length=0;//空表长度为0
    L->listsize=LIST_INIT_SIZE;//初始存储容量

    return OK;

}

//========顺序表插入元素==========
Status ListInsert(Sqlist *L,int i,int e) {  

    //在顺序线性表L中第i个位置之前插入新的元素e
    //i的合法值为1=<i<=length+1
    int j;
    if(i<1|| i>L->length+1) {
        return ERROR;//i值不合法

    }
    if(L->length>=L->listsize) {
        //当前存储空间已满,增加分配
        L->elem=(int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));  
        if(!L->elem) {
            return OVERFLOW;//当前存储分配失败
        }
        L->listsize+=LISTINCREMENT;//增加存储容量
    }
    //插入操作,需要将从插入位置开始的后续元素,逐个后移
    for(j=L->length-1; j>=i-1; j--) {
        L->elem[j+1]=L->elem[j];

    }
    L->elem[i-1]=e;
    L->length++;//表长增1
    return OK;

}

//==========删除元素==========
Status ListDelete(Sqlist *L,int i,int *e) { 

    //在顺序线性表L中删除第i个值,并用e返回其值
    //i的合法值1<=i<=ListLength(L)
    {
        if(i<1||i>L->length) {
            return ERROR;
        }
        *e=L->length--;
        return OK;

    }
}

//===========打印==========
void printSqlist(Sqlist *L) {
    printf("\n开始打印顺序表。。。\n");
    printf("length=%d,listsize=%d.\n",L->length,L->listsize);
    int i=0;
    for(; i<L->length; i++) {
        printf("%d",L->elem[i]);

    }
    printf("\n");
    printf("打印完毕\n");

}

int main() {
    Sqlist L;
    int  e=0;//1
    int i;
    InitList(&L); 
    printf("addr4=%p\n",L


我想知道为什么初始化线性表这个函数为什么能让主函数的L指向那片空间
我的理解是这样的
2019-04-12 12:29
ZJYTY
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:92
专家分:700
注 册:2018-12-20
得分:0 
回复 6楼 桔梗老板
可以看看四楼的解释。

-------------------------------若有不当之处,敬请谅解-------------------------------
2019-04-12 13:51
桔梗老板
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2019-3-25
得分:0 
回复 4楼 word123
2019-04-12 14:30
桔梗老板
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2019-3-25
得分:0 
回复 7楼 侠之大者
看懂四楼的解释。但不知道是不是没理解透彻 还是不能理解我要问的问题 可以解释一下吗

[此贴子已经被作者于2019-4-12 14:34编辑过]

2019-04-12 14:32
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
得分:0 
Sqlist L;
InitList(&L);
Status InitList(Sqlist *L) {   //这里L是一个指针变量,指向外面那个L的存储位置,可以访问,它们操纵的是同一个空间,但如果对L重新分配空间,就不是指向同一个位置了
    L->elem=(int *)malloc (LIST_INIT_SIZE*sizeof(int));
}

//初始化之后你的结构应该是下面这样的
elem  ->这个指针指向新分配的空间
len = 0
listsize = LIST_INIT_SIZE
2019-04-12 15:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-494079-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.263560 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved