啊哈磊_编程从这里起步

标题: 求大神,线性表为啥实现不了? [打印本页]

作者: 祥子    时间: 2014-4-15 09:54
标题: 求大神,线性表为啥实现不了?
#include <stdio.h>

#define  MAXSIZE 30

//struct definition
typedef struct
{
        char name[ MAXSIZE ];
    char num[ MAXSIZE ];
        int score ;
}seqList;
void seqList_Init(seqList L[],int *len);
void seqList_Insert(seqList L[] ,int i,int *len);
void seqList_Delete(seqList L[] ,int i,int *len);
void Output(seqList L[],int len);



void seqList_Init(seqList L[],int *len)
{
        int i;//局部变量,作用范围在子函数内部
        printf("input the number:",MAXSIZE);
        scanf("%d",len);
        printf("input the information(name number score) :\n",*len);
        for(i=0;i<=*len-1;i++)
        {        //printf("input information of %d(name,number,score):",i);
                fflush(stdin);
                scanf("%s%s%d",&L[i].name,&L[i].num,&L[i].score);
        }
}
void Output(seqList L[],int len)
{        int i;
        printf("length: %d\n",len);
        for(i=0;i<=len-1;i++)
        {       
        printf("   %s    %s %4d\n",L[i].name,L[i].num,L[i].score);
        }
}

void seqList_Insert(seqList L[],int *len)
{
        int i,j;
        printf("input location:");
        scanf("%d",&i);
        for(j=(*len)-1;j>=i;j--)//插入前数据挪位
        {        L[j+1]=L[j];//把第i个位置空出来,等待数据插入
        }
        printf("input information(name,number,socre):");
        scanf("%s %s %d",&L[i-1].name,&L[i-1].num,&L[i-1].score);
        (*len)++;
}

void seqList_Delete(seqList L[] ,int *len)
{
        int i,j;
        printf("input delete location:");
        scanf("%d",&i);
        for(j=i+1;j<=(*len)-1;j++)
        {        L[j-1]=L[j];
        }
        (*len)--;
}

int main()
{
        seqList a[10];
    int length;
        seqList_Init(a,&length);
        printf("current data:\n");
        Output(a,length);
        printf("current data(after insert):\n");
        seqList_Insert(a,&length);
        printf("current data(after delete):\n");
        seqList_Delete(a ,&length);
        getchar();
    return 0 ;
}


作者: rosynirvana    时间: 2014-4-15 09:54
本帖最后由 rosynirvana 于 2014-4-15 11:08 编辑

从头改一遍

void seqList_Insert(seqList L[] ,int i,int *len);
void seqList_Delete(seqList L[] ,int i,int *len);
这两个函数原型和下面函数定义冲突了
seqList_Insert(a,&length);
seqList_Delete(a ,&length);
同样,后面的这两句要跟着改

printf("input the number:",MAXSIZE);
这句少了一个占位符?还是后面的MAXSIZE不需要?

printf("input the information(name number score) :\n",*len);
这句一样的问题,前面的格式化字符串里没有占位符,后面却有一个变量

   fflush(stdin);
这句是未定义的,看上去也没必要,后面的scanf是自动跳过空白字符的,去掉


  1.   for(j=(*len)-1;j>=i;j--)//插入前数据挪位
  2.         {        L[j+1]=L[j];//把第i个位置空出来,等待数据插入
  3.         }
  4.         printf("input information(name,number,socre):");
  5.         scanf("%s %s %d",&L[i-1].name,&L[i-1].num,&L[i-1].score);
复制代码

这一段,想必是你把“第i个元素”和“下表是i的元素”搞混了

getchar();
一个getchar通常是没法暂停的,要多写几个

作者: rosynirvana    时间: 2014-4-15 10:15
你说的线性表到底是啥?哪本中文书上自创的名词?
是抽象数据结构还是具体数据结构?
如果是抽象数据结构,它支持哪几个操作?时间复杂度是什么?
作者: 祥子    时间: 2014-4-15 10:30
rosynirvana 发表于 2014-4-15 10:15
你说的线性表到底是啥?哪本中文书上自创的名词?
是抽象数据结构还是具体数据结构?
如果是抽象数据结构 ...

是具体数据结构中的线性表
作者: rosynirvana    时间: 2014-4-15 10:44
祥子 发表于 2014-4-15 10:30
是具体数据结构中的线性表

具体数据结构?那是哪种语言或哪种库里面的?
C或者它的标准库可是没有所谓线性表这种东西的……
作者: 祥子    时间: 2014-4-15 10:54
rosynirvana 发表于 2014-4-15 10:44
具体数据结构?那是哪种语言或哪种库里面的?
C或者它的标准库可是没有所谓线性表这种东西的……

这是清华大学出版的《数据结构》C语言版里面的
作者: rosynirvana    时间: 2014-4-15 10:59
祥子 发表于 2014-4-15 10:54
这是清华大学出版的《数据结构》C语言版里面的

你要考研吗?
不考研就别看那本书了
作者: 祥子    时间: 2014-4-15 11:10
rosynirvana 发表于 2014-4-15 10:59
你要考研吗?
不考研就别看那本书了

这是我们的教材
作者: 祥子    时间: 2014-4-15 11:12
谢谢你咯,我找到方法了
作者: rosynirvana    时间: 2014-4-15 11:15
这段代码可以改成能运行的,但是没多少意义
这书和大多数中文统编教材一样,自己生造出一个完全没必要的粗浅概念
(线性表?不就是RAM上面的一片连续主存吗?或者直接说C上面的array不就行了?)
然后写的代码都是玩具级别的

seqList_Init要求输入一个表的最大长度,但是这个长度又完全不去检测有没有越界,那么把数组再封装一遍又有何意义呢?

这几个函数有重用的价值吗?没有的话为什么要专门写成一个函数呢?写到main里面明显可以更简洁的啊

当然,是为了演示,都是为了演示某个功能的玩具代码

结果一个玩具代码还写得这么凌乱不堪留下安全漏洞
作者: 祥子    时间: 2014-4-15 15:39
rosynirvana 发表于 2014-4-15 11:15
这段代码可以改成能运行的,但是没多少意义
这书和大多数中文统编教材一样,自己生造出一个完全没必要的粗 ...

不是啊,这段代码可以说是这本书的精髓了,只是对这样的结构熟悉一下而已,所以里面有很多漏洞也没有去注意,检索和其他一些内存问题也没注意。我只是初学者,想弄懂问题而已
作者: rosynirvana    时间: 2014-4-15 16:08
祥子 发表于 2014-4-15 15:39
不是啊,这段代码可以说是这本书的精髓了,只是对这样的结构熟悉一下而已,所以里面有很多漏洞也没有去注 ...

虽然那本书不值得看,但是这么简单的代码,怎么也说不上精髓
其实就是一个array基本操作

  1. /* Delete element at position pos */
  2. for(i=pos; i+1<length; ++i)
  3.   arr[i] = arr[i+1];

  4. /* Insert target at position pos */
  5. for(i=length-1; i>pos; --i)
  6.   arr[i] = arr[i-1];
  7. arr[pos] = target;
复制代码

初始化和输出更简单,学语言的时候一定会讲到,就不再写了
用最基本的array几行就写完了,偏偏用struct array,还要另外封装一个没有重用性的函数

初学者更应该学标准地道的语言和习惯写法,而不是跟着国内瞎掰出来的东西去学
作者: 祥子    时间: 2014-4-15 16:13
rosynirvana 发表于 2014-4-15 16:08
虽然那本书不值得看,但是这么简单的代码,怎么也说不上精髓
其实就是一个array基本操作

你是大神啊!不懂我们这些学渣
作者: 祥子    时间: 2014-4-15 16:16
祥子 发表于 2014-4-15 16:13
你是大神啊!不懂我们这些学渣

你说的那个struct是结构体,形式不一样啊。就像调用函数可以用指针也可以不用一样
作者: 超神级    时间: 2014-4-15 21:45
rosynirvana 发表于 2014-4-15 16:08
虽然那本书不值得看,但是这么简单的代码,怎么也说不上精髓
其实就是一个array基本操作

我发现严蔚敏出版的那本数据结构有好多内容是抄袭别人的...
作者: rosynirvana    时间: 2014-4-15 21:57
超神级 发表于 2014-4-15 21:45
我发现严蔚敏出版的那本数据结构有好多内容是抄袭别人的...

数据结构这套东西都是老外搞出来的,所以不可能有啥原创性

如果是说代码,其实烂代码看起来都挺相似的……
作者: 超神级    时间: 2014-4-15 22:01
rosynirvana 发表于 2014-4-15 21:57
数据结构这套东西都是老外搞出来的,所以不可能有啥原创性

如果是说代码,其实烂代码看起来都挺相似的 ...

....嗯。这样啊!!!




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2