2014-01-27 22 views
0

以下是我的c程序,它对数组执行各种操作。当我删除任何元素时,delete_ele函数会正确删除并显示数组,但遍历函数会显示一些垃圾值。例如。如果最初我有4个元素并删除第一个元素,delete_ele函数将显示剩余的3个元素,但遍历函数显示4个元素(其余3个元素以及最后的垃圾值)。请告诉我错误。c中的菜单驱动程序在数组上执行各种操作

#include<stdio.h> 
#include<conio.h> 
void insert_ele(int i,int ar[],int len){ 
    int ele, loc; 
    printf("\nEnter element to be inserted : "); 
    scanf("%d",&ele); 
    printf("\nEnter location : "); 
    scanf("%d",&loc); 
    if(i==19){ 
     printf("\nOverflow"); 
    } 
    else{ 
     while(i>=loc){ 
      ar[i+1]=ar[i]; 
      i--; 
     } 
    ar[loc]=ele; 
    len++; 
    printf("\nNew Array : "); 
    for(i=0;i<len;i++){ 
     printf("\t%d",ar[i]); 
    } 
    } 
} 
void delete_ele(int i,int ar[],int len){ 
    int loc; 
    printf("\nEnter location of element to be deleted : "); 
    scanf("%d",&loc); 
    if(len==0){ 
     printf("\nUnderflow"); 
    } 
    else{ 
     for(i=loc;i<len;i++){ 
      ar[i]=ar[i+1]; 
     } 
     len--; 
     printf("\nNew Array : "); 
     for(i=0;i<len;i++){ 
     printf("\t%d",ar[i]); 
     } 
    } 
} 
void find_ele(int i,int ar[],int len){ 
    int ele, count=0; 
    printf("\nEnter element to be searched : "); 
    scanf("%d",&ele); 
    for(i=0;i<len;i++){ 
     if(ar[i]==ele){ 
      count++; 
     } 
    } 
    if(count == 0){ 
     printf("\nElement does not exist"); 
    } 
    else{ 
     printf("\nElement found %d times",count); 
    } 
} 
void traverse(int i, int ar[], int len){ 
    printf("\nTotal number of Elements are : %d",len); 
    printf("\nElements are : "); 
    for(i=0; i<len; i++){ 
     printf("\t%d",ar[i]); 
    } 
} 
void main(){ 
    int ar[20], i=0, len=0, ch; 
    char choice; 
    clrscr(); 
    printf("\nEnter number of elements you want to insert : "); 
    scanf("%d",&len); 
    for(i=0; i<len; i++){ 
     printf("Enter element %d : ",i); 
     scanf("%d",&ar[i]); 
    } 
    i--; 
    label: 
    printf("\nPress 1 to insert, 2 to delete, 3 to find any element"); 
    printf("\n or 4 to traverse the array : "); 
    scanf("%d",&ch); 
    switch(ch){ 
     case 1:insert_ele(i, ar, len); 
     break; 
     case 2:delete_ele(i, ar, len); 
     break; 
     case 3:find_ele(i, ar, len); 
     break; 
     case 4:traverse(i, ar, len); 
     break; 
     default:printf("\nInvalid Option"); 
     break; 
    } 
    printf("\nPress y to continue or any other key to quit : "); 
    scanf("%s",&choice); 
    if(choice=='y' || choice=='Y'){ 
     goto label; 
    } 
    getch(); 
} 
+0

您是否尝试过通过代码在调试器步进和检查变量的状态?这应该会直接导致你的错误。 –

+0

[c中的菜单驱动程序在链表上执行各种操作]的可能重复(http://stackoverflow.com/questions/21364493/menu-driven-program-in-c-to-perform-various-operations-关联列表) –

+0

@PaulR是否重复我不认为,尽管找到但标记重复的简单错误无效。 –

回答

2

,因为你在delete_ele()

尝试递减局部变量(len):

void delete_ele(int i, int ar[], int *len){ 
    int loc; 
    printf("\nEnter location of element to be deleted : "); 
    scanf("%d", &loc); 
    if(*len == 0){ 
     printf("\nUnderflow"); 
    } 
    else{ 
     for(i=loc; i< (*len - 1); i++){ 
      ar[i] = ar[i + 1]; 
     } 
     (*len)--; 
     printf("\nNew Array : "); 
     for(i=0; i<*len; i++){ 
      printf("\t%d", ar[i]); 
     } 
    } 
} 

,以分享len

同为insert_ele()

+0

对不起,我应该评论,但编辑,点是条件应该是'(* len - 1)' –

+0

行动,抱歉格里杰什,我没有看到,随时编辑 –

+0

非常感谢。工作就像一个魅力... – rippy

1

一个错误是:delete_ele()功能由于数组索引调用未定义行为超出范围在for循环时len值为20(读注释):

for(i = loc; i < len; i++){ 
    ar[i] = ar[i + 1]; 
} //  ^^^^^^^ out of index for `i = len - 1` 
    // max index can be `len - 1` but when `i = len - 1` 
    // then ar[i + 1] == ar[len] that causes array out-of-index 

应该是:

for(i = loc; i < len-1; i++){ # replaced `len` by `len - 1` 
    ar[i] = ar[i + 1]; 
} 

而且看起来类似的bug也在其他函数中。

1

问题是lenmain没有得到更新delete_eleinsert_ele。 您通过价值将len传递给这些函数。然后本地副本在相应的功能内更新,但主体中的len保持不变。

纠正此问题的一种方法是通过引用(作为指针)传递lendelete_eleinsert_ele

相关问题