2015-06-03 2 views
0

Я пытаюсь создать список ссылок. У меня есть функция, которая удаляет (удалять функцию) материал из моего списка ссылок. Но, похоже, он падает, когда я пытаюсь сравнить строки. Он работает до последнего произвольного оператора printf.несовместимые типы при назначении типа 'char [50]' из типа 'char *'

Вот код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
struct node { 
    char data[50]; 
    struct node *next; 
}*head; 

int main() 
{ 
    //creates a sudo user interface 
    printf("1. Insert\n"); 
    printf("2. Display\n"); 
    printf("3 Count\n"); 
    printf("4. Delete\n"); 
    printf("5. Exit\n"); 

    //create the portion that decides the user input 
    int userSelection = 0 ; 
    scanf("%d", &userSelection); 
    userSelect(userSelection); 


    return 0; 
} 
//this function will handle user imput 
void userSelect(int num) 
{ 
    if(num == 1) 
    { 
     printf("What is your name?\n"); 
     char userName[30]; 
     scanf(" %s", userName); 
     add(userName); 

    } else if(num ==2) { 
     display(); 

    } else if (num ==2){ 
     //do something 
    } else if (num ==3){ 
     printf("%d", count()); 
     main(); 
    } else if (num ==4){ 
     char delName[50]; 
     printf("Who do you want to remove?\n"); 
     scanf("%s", delName); 
     delete(delName); 
    }else if (num == 5){ 
     // return 0; 
    }else if (num > 6){ 
     printf("\n52Please make sure you use a valid option!\n\n"); 
     main(); 
    } 


} 

void add(char userName[]) 
{ 
    struct node *temp; 

    temp=(struct node *)malloc(sizeof(struct node)); 

    strcpy(temp->data, userName); 

    if (head== NULL) 
    { 
     head=temp; 
     head->next=NULL; 
    } 
    else 
    { 
     temp->next=head; 
     head=temp; 
    } 
    printf("\n"); 
    main(); 
} 
int count() 
{ 
    struct node *n; 
    int c=0; 
    n=head; 
    while(n!=NULL) 
    { 
     n=n->next; 
     c++; 
    } 
    printf("\n"); 
    return c; 
} 
void display(struct node *r) 
{ 
    r=head; 
    if(r==NULL) 
    { 
     return; 
    } 
    while(r!=NULL) 
    { 
     printf("%s ",r->data); 
     r=r->next; 
    } 
    printf("\n"); 
    main(); 
} 


void delete(char delName) 
{ 
    struct node *temp, *prev; 
    temp=head; 
    printf("sffs\n"); 
    while(temp!=NULL) 
    { 
     printf("sdg\n"); 
     if(strcmp(temp->data, delName)==0) 
     { 
      if(temp==head) 
      { 
       head=temp->next; 
       free(temp); 
       return 1; 
      } 
      else 
      { 
       prev->next=temp->next; 
       free(temp); 
       return 1; 
      } 
     } 
     else 
     { 
      prev=temp; 
      temp= temp->next; 
     } 
    } 
    main(); 
} 

Я думаю, что это что-то делать с STRCMP в function..but удаления кто-нибудь есть какие-нибудь идеи?

+0

Вы должны опубликовать остальную часть вашего кода. У вас есть «свободный», и мы не видим, где он выделяется. Также вы называете 'main'? Это не может быть прав ... – rost0031

+0

Действительно ли 'delName' является' char' или это 'char *'? Вы должны скомпилировать все предупреждения ('gcc -Wall', если вы используете gcc). – JS1

+0

Я назвал main только для того, чтобы назначить меню снова, как только пользователь выполнит задание, он вернется и снова предложит их. –

ответ

1

Основная проблема заключается в том, что это:

void delete(char delName) 

должно быть такое:

void delete(char *delName) 

Однако, есть много других проблем, с вашей программой, и это заняло бы много времени, чтобы перечислить все их. Я просто дам вам две возможности исправить:

  1. Вы должны включить предупреждения и исправить их все.

  2. Ваши функции не должны звонить main(). Вместо main() должен содержать цикл, например:

    //create the portion that decides the user input 
    int userSelection = 0 ; 
    do { 
        scanf("%d", &userSelection); 
        userSelect(userSelection); 
    } while (userSelection != 5); 
    
+0

Функция 'delete' также трудно выполнить, поскольку условные выражения все' return' еще продолжают выполняться с инструкциями 'else'. Инструкция 'temp = temp-> next;' должна быть безусловной, поскольку это необходимо для продолжения цикла. –

+0

ОК спасибо! Ill заменит эту проблему main(). Поэтому вызов main в любой функции - это нет. –

Смежные вопросы