Прежде всего, все ваши функции всегда возвращают 0 - даже в случае ошибки.Жизнь была бы намного проще, если бы вы дали ранг как int и вернули его новое значение.
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, ch должно быть как «n», так и «N»в то же время.Вы действительно хотите
while(ch!='n' && ch!= 'N')
ОБНОВЛЕНИЕ 2: Я только что заметил самую большую проблему в вашем коде.name
везде в вашем коде только когда-либо указывает на единственный массив, определенный в main ().Каждый раз, когда вы вводите новое имя, он перезаписывает этот массив, и, поскольку каждый узел указывает на этот один массив, имя меняется везде.Вам нужно сделать копию.в insert ():
node *new = (node *)malloc(sizeof(node));
new->name = strdup(name); // use malloc internally.
Затем в delete () вам нужно освободить эту память (если говорить о том, вам тоже нужно освободить узел ...)
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
.