2010-08-12 44 views
1

斐伊川指针实现,阵列的使用C

我一直在试图写一个程序......我们已经具有等级字段和名字field.The指向此结构的结构存储在一个数组固定大小。我有如下,我有一定的问题,实现了它...... 我写的代码是:

#include<stdio.h> 
#include<stdlib.h> 
#include<malloc.h> 

typedef struct 
{ 
int rank; 
char *name; 
}node; 

int insert(node **a , char name[] , int *rank) 
{ 
if(*rank >= 5) 
    { 
    printf("\n Overflow "); 
    return 0; 
    } 
    (*rank)++; 
    node *new = (node *)malloc(sizeof(node)); 
    new->name = name; 
    new->rank = *rank; 
    a[*rank] = new; 

    return 0; 
} 

int delete(node **a , int *rank) 
{ 
    int i = *rank; 
    if(*rank<0) 
    { 
    printf("\n No elements"); 
    return 0; 
    } 
    printf("\n Deleting %d , %s ",((a[*rank]))->rank,((a[*rank]))->name); 
    printf("\n Reordering the elements "); 
    while(i<5) 
    { 
    a[i] = a[i+1]; 
    } 
    return 0; 
} 

int display(node **a , int rank) 
    { 
    while(rank>0 && (a[rank])>0) 
    { 
    printf(" rank = %d name = %s \n",((a[rank])->rank),((a[rank])->name)); 
    rank--; 
    }    
    return 0; 
    } 

int main() 
{ 
    node *a[5] = {NULL}; 
    char ch = 'y'; 
    int choice,rank = -1; 
    char name[10]; 
    while(ch!='n' || ch!= 'N') 
    { 
    printf("\n Enter 1 to insert , 2 to delete , 3 to display and 4 to exit \n"); 
    scanf("%d",&choice); 
    switch(choice) 
    { 
     case 1: 
     printf("\n Enter name to insert"); 
     gets(name); 
     insert(a,name,&rank); 
     break; 
     case 2: 
     printf("\n Enter rank to delete "); 
     scanf("%d",&rank); 
     delete(a,&rank); 
     break; 
     case 3: 
     display(a,rank); 
     break; 
     case 4: 
     exit(0); 
     default: 
     printf("\n Invalid choice...please enter again "); 
     break; 
    } 
    ch = getchar(); 
    } 
return 0; 
} 

第一件事是系统自动进行选择,除了第一次...(我不能”在那里发现错误...),我对这个指针的东西有点困惑...请看看它是否正常...任何更正都欢迎,请给我一些解释,为什么它是错误的,我们如何shd做...

谢谢

回答

2

首先,所有的函数总是返回0 - 甚至错误条件。如果你将等级作为一个整数通过,并且返回它的新值,生活将变得如此简单。

rank = insert(a, name, rank); 
/* : */ 
/* : */ 
int insert(node **a , char name[] , int rank) 
{ 
if(rank >= 5) 
{ 
    printf("\n Overflow "); 
    return 0; 
} 
rank++; 
node *new = (node *)malloc(sizeof(node)); 
new->name = name; 
new->rank = rank; 
a[rank] = new; 
return rank; 
} 

它已经多年,因为我最后一次使用scanf,但我记得,你必须考虑在流,这意味着每个字符,“不要忘了输入”。

scanf("%d\n",&choice); 

还与gets(name);,如果你输入更多的塔9个字,你很拧的,因为它会覆盖你的程序的堆栈。

更新: 此外,你有两种方式退出这个程序,除了一个永远不会工作。你可以选择选项“4”,这将呼吁exit(0)。或者,在每个命令结束时,您在逐步结束之前等待角色。看样子你希望能够进入“N”疗法和退出,只是将无法正常工作:

while(ch!='n' || ch!= 'N') 

为评估为false,通道必须是“N” &“N”的同时。你真的想

while(ch!='n' && ch!= 'N') 

UPDATE2: 我只是在你的代码发现的最大问题。您的代码中的任何地方都只指向main()中定义的单个数组。每次输入新名称时,它都会覆盖该数组,并且由于每个节点都指向该数组,因此名称在任何地方都会更改。你需要复制一份。 在插入():

node *new = (node *)malloc(sizeof(node));  
new->name = strdup(name); // use malloc internally. 

然后在删除(),你需要释放内存(说到这,你需要释放节点有太多......)

printf("\n Deleting %d , %s ",((a[*rank]))->rank,((a[*rank]))->name);  
free(a[*rank]->name); 
free(a[*rank]); 
printf("\n Reordering the elements "); 

记住,无论您何时致电malloc,您最终都必须致电free

+0

不,你不需要'scanf()'格式的'\ n',这可能会导致它等待* extra *换行符。永远不要使用'gets':使用'fgets'或者写你自己的'getline'。 – schot 2010-08-12 14:42:01

+0

这并不能解决我的问题....事实上,我被要求只给出一次选择......在第一次迭代中...... IT继续对其余的iters执行case 1。 – Flash 2010-08-12 14:55:23

0

我对使用“rank”变量感到困惑。 Main将它用作数组中最后一个节点的索引,并且这些节点将它用作排名。添加节点会增加它,但删除节点不会减少它。

至少,我建议将index变量与ranking变量分开,以使逻辑更容易遵循。

就我个人而言,我会编写一个结构来封装具有自己的索引跟踪和添加/删除功能的数组。这样,Main可以自由阅读用户选项并操作新节点的等级,而不用担心数据结构的细节。

+0

实际上,结构的排名是阵列中存储指向结构的指针的位置 – Flash 2010-08-12 14:57:00

+0

当您删除节点时,将所有节点移动一个块以下。但是你不会降低你转移的节点的等级(所以他们的等级会不同步),并且你不会降低主等级变量(所以后面的增加会跳过一个位置)。另外,当你移动剩余的元素时,你不会清除最后一个元素。所以你会在阵列的末尾加倍。 – Marc 2010-08-12 15:01:48

+0

是啊...我有点错过了编码dat – Flash 2010-08-12 17:20:18

0
while(ch!='n' || ch!= 'N') 
    { 
    printf("\n Enter 1 to insert , 2 to delete , 3 to display and 4 to exit \n"); 
    scanf("%d",&choice); getchar(); 
    . 
    . 
    . 
    //ch = getchar(); 
    } 

使用getchar()以及scanf()会导致此问题。由于在将字符读入'ch'之后'\ n'作为scanf的输入。解决你的问题的一种方法是在读取gets()之前读取带有额外getchar()的'\ n'。 你也应该修改while循环删除。