Как я могу вставить / добавить и удалить строку в списке через функцию в C? - PullRequest
0 голосов
/ 31 декабря 2018

Кажется, что мой код не работает, потому что я не могу добавить строку в список.Кажется, список остается пустым.После каждого ввода строки, такой как «asd» или одного символа, сообщение, которое появляется каждый раз:

Список пуст

Кроме того, я незнать, может ли работать функция удаления, потому что функция вставки не работает.

Вот мой код (он немного длинный):

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

struct listnode
{
char data[100];
listnode *nextPtr;
};

Вот мойвставить функцию.PS: я хочу вставить имена, чтобы они могли быть расположены в алфавитном порядке.

void insert(struct listnode *strPtr, char value[])
{
struct listnode *previousPtr, *currentPtr, *newPtr;

newPtr=(listnode*)malloc(sizeof(listnode));
strcpy(newPtr->data,value);
newPtr->nextPtr=NULL;
previousPtr=NULL;
currentPtr=strPtr;
if(newPtr!=NULL)
{
    while(currentPtr!=NULL && strcmp(currentPtr->data,value)>0)
    {
        previousPtr=currentPtr;
        currentPtr=currentPtr->nextPtr;
    }

    if(previousPtr==NULL)
    {
        newPtr->nextPtr=strPtr;
        strPtr=newPtr;
    }
    else
      {
        previousPtr->nextPtr=newPtr;
        newPtr->nextPtr=currentPtr;
       }
     }else printf("%s was not inserted. Insuffiecient memory!",value);

       }

Вот моя функция удаления

  const char *del(struct listnode* strPtr, char value[])
    {
   struct listnode *previousPtr, *currentPtr, *tempPtr;

  if(strcmp(value, strPtr->data)==0) /*if the first node shall be 
   deleted*/
{
  /*delete node*/
  tempPtr=strPtr;
  strPtr=strPtr->nextPtr;
  free(tempPtr);
  return value;
  }
  else
   {
    previousPtr=strPtr;
    currentPtr=strPtr->nextPtr;
    while(currentPtr!=NULL && strcmp(value, currentPtr->data)!=0)
    {
        previousPtr=currentPtr;
        currentPtr=currentPtr->nextPtr;

    }

    if(currentPtr!=NULL)
    {
        tempPtr=currentPtr;
        previousPtr->nextPtr=currentPtr->nextPtr;
        free(tempPtr);
        return value;
    }
      }


    return '\0';//daca nu s-a gasit nodul

    }

    void instructions(void)
      {
    printf( "Options:\n"
     " 1 to insert a name in the list.\n"
     " 2 to delete a name from the list.\n"
     " 3 to exit.\n" );
     }

  void printList(struct listnode *currentPtr)
   {
      if(currentPtr==NULL)
        printf("List is empty\n");
        else
         {
    printf("List is:\n");
    while(currentPtr!=NULL)
    {
        printf("%s -->",currentPtr->data);
        currentPtr=currentPtr->nextPtr;
     }
  }
}

  int Empty(struct listnode *strPtr)
   {
     return strPtr == NULL;
    }

   int main()
      {
      struct listnode* startPtr;
       startPtr=NULL;

int optiune;
char nume[100];

instructions();
printf("->> ");
scanf("%d",&optiune);

Вот меню

  while(optiune!=3)
  {
    switch(optiune)
    {
        case 1: 
            printf("Enter name:");
            fflush(stdin);
            gets(nume);
            insert(startPtr, nume);
            printList(startPtr);
            break;

        case 2:
            printf("Search by name to delete from list:");
            gets(nume);
            if(!Empty(startPtr))
            {
                if(del(startPtr, nume))
                {
                    printf("%s a fost sters din lista!\n");
                    printList(startPtr);
                }else printf("%s nu a fost gasit!\n",nume);

            }else
                printf("List is empty!");
            break;

        case 3:
            break;
        default:
            printf("No such option!\n\n");
            instructions();
            break;
    }
    printf("\n->> ");
    scanf("%d",&optiune);
}
printf("Execution stopped.\n" );
return EXIT_SUCCESS;

}

1 Ответ

0 голосов
/ 31 декабря 2018

Я думаю, что я заставил его работать.

Первое, что я изменил в вашем коде, это определение вашей структуры как typdef.

typedef struct{
   char data[100];
   struct listnode *nextPtr;
}listnode;

Это то, как я учился, и это делает егопроще объявить переменные этого типа структуры, так как мы можем просто вводить «listnode» вместо «struct listnode» все время.

Поскольку вы не дали нам полный код, мне пришлось удалить некоторые вещитак что я мог бы скомпилировать это.Поскольку вы просто спрашиваете, почему список остается пустым после функции «вставки», я думаю, что это хорошо для вас. Итак, вот функции «main ()» и «printlist ()», которые я использовал:

void printList(listnode *strPtr){
    listnode *currentPtr = malloc(sizeof(listnode));

    //Setting the ptr to run the list
    currentPtr = strPtr;
    if(strPtr == NULL) printf("Fail\n");

    //Printing the list,while next is different than NULL keep going
    printf("\nListing:\n");
    while(currentPtr->data != NULL){
       printf("%s\n",currentPtr->data);
       currentPtr = currentPtr->nextPtr;
   }
}

int main(){
   char nume[128];
   listnode *startPtr = NULL;//Initializing the fisrt ptr

   //Reading the name
   printf("Enter name:\n");
   scanf("%s",nume);

   //Inserting and printing the list
   insert(&startPtr,nume);
   insert(&startPtr,"Hello");
   printList(startPtr);

   return 0;   
 }

Некоторые довольно простые вещи.Теперь о главном:

Как сказали нам наши друзья в комментариях, в C указатель передается по значению.Это означает, что какие бы изменения вы ни делали в функции, она не изменит переменную startPtr в main ().Чтобы исправить это, ему нужно добавить еще один '*' к параметрам функции.Это означает, что теперь мы передаем аргумент strPtr по ссылке.

Вот последняя функция:

void insert(listnode **strPtr,char value[]){
    listnode *previousPtr, *currentPtr,*newPtr;

   //Allocating the nodes
   newPtr = malloc(sizeof(listnode));
   currentPtr = malloc(sizeof(listnode));

   //Initializing the new node and setting the currentPtr
   strcpy(newPtr->data,value);//Copying the name to the new node
   newPtr->nextPtr = NULL;
   currentPtr = strPtr;

   //Previous is NULL
   previousPtr = NULL;

   if(newPtr != NULL){
       //If there's already a node in the list let's find the right location 
       //For the new one(sorting)
       while(currentPtr != NULL && strcmp(currentPtr->data,value) > 0){
           previousPtr = currentPtr;
           currentPtr = currentPtr->nextPtr;
       }

       //If previous is NULL than this is the first node,no while iterations
       //Note:strPtr is passed by reference,extra '*' needed
       if(previousPtr == NULL){
           newPtr->nextPtr = *strPtr;
           *strPtr = newPtr;
       }else{
           previousPtr->nextPtr = newPtr;
           newPtr->nextPtr = currentPtr;
           *strPtr = newPtr;
       }
   }else{ 
       printf("%s was not inserted. Insuffiecient memory!",value);
   }
}

Обратите внимание, что мы также используем дополнительный '*' при установке newPtr в strPtr.Это изменит фактическую переменную startPtr из main ().

Из этого, я надеюсь, вы также можете исправить функцию удаления!Не забудьте освободить память!Также не забывайте комментировать свой код.Очень важно помочь вам и другим людям понять это, как бы легко это ни было!

Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...