2016-04-28 14 views
0

Ich bin neu in C, also suche ich Hilfe, weil ich feststecke. Nach dem Erstellen einer Linked-List-Bibliothek, aus der ich alle Knoten, die der Benutzer möchte, hinzufügen, löschen und drucken kann, sollte ich dem Programm eine zusätzliche Funktion des Integer-Typs hinzufügen und eine -1 zurückgeben, wenn der Wert nicht existiert der verknüpften Liste. Wenn der Wert in der verknüpften Liste vorhanden ist, sollte die Position des Elements zurückgegeben werden.Datenstrukturen - Bibliothek mit verknüpften Listen in C

Zum Beispiel in dieser verketteten Liste (a -> b -> c -> d -> NULL), wenn ich die Position von c wissen will, sollte es mir ein 3 zurückkehren, wenn ich die Position von G es soll mich wissen will -1 zurück

Diese ist das Programm, das ich bis jetzt machen konnte:

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

struct ListNode 
{ 
char data; 
struct ListNode *nextNode; 
}; 
typedef struct ListNode node; 


int main() 
    { 
    node *startNodePtr= NULL; 
    int choice; 
    char value; 
    printf("\t\t\tLIST OF CHARACTERS\n"); 
    do 
    { 
     printf("\n1.Add New Node \t2.Delete Node \t3.Print Current List \t4.QUIT\n\n");//user friendly interface 
     scanf("%d",&choice); 
     switch(choice) 
     { 
      case 1: printf("Enter Character: "); 
       scanf("\n%c",&value); 
       insertNode(&startNodePtr,value);//calling the function to add a node 
       break; 

      case 2: printf("Delete Character: "); 
       scanf("\n%c",&value); 
       deleteNode(&startNodePtr,value);//calling the function to remove a node 
       break; 

      case 3: printList(startNodePtr);//calling the function to list the nodes 
       break; 

      case 4: continue;//if we type 4 it won't show the default answer 

      default:printf("\t\tINVALID ANSWER! Please type 1. 2. 3. or 4.\n");// in case we type any other character that is not 1, 2, 3 or 4. In this way the program will not crash 
       break; 

     } 

    } while(choice!=4);//keep adding or deleting nodes until we enter 4 which refers to "QUIT" 

return 0; 
} 

void insertNode(node **sPtr, char add)//function to add a node 
    { 
    node *newPtr; 
    node *curPtr; 
    node *prevPtr; 
    newPtr=malloc(sizeof(node)); 
    newPtr->data=add; 
    newPtr->nextNode=NULL; 
    prevPtr=NULL; 
    curPtr=*sPtr; 

    while(curPtr!=NULL) 
    { 
     prevPtr=curPtr; 
     curPtr=curPtr->nextNode; 
    } 
    if (prevPtr==NULL) 
    { 
     *sPtr=newPtr; 
    } 
    else 
    { 
     prevPtr->nextNode=newPtr; 
    } 
} 
void deleteNode(node **sPtr, char remove)//function to remove a node 
    { 
    node *curPtr; 
    node *prevPtr; 
    curPtr=*sPtr; 
    prevPtr=NULL; 

    if(curPtr->data==remove) 
    { 
     *sPtr=curPtr->nextNode; 
     free(curPtr); 
     return; 
} 
while (curPtr!=NULL) 
{ 
    if (curPtr->data==remove) 
     {prevPtr->nextNode=curPtr->nextNode; 
     free(curPtr); 
     return;} 
    else 
     {prevPtr=curPtr; 
     curPtr=curPtr->nextNode;} 
} 
} 


void printList(node *sPtr)//function to list the nodes 
{ 
if (sPtr==NULL) 
{ 
    printf("The list is empty!\n"); 
} 
else 
{ 
    while (sPtr!=NULL) 
    { 
     printf("\n%c-->", sPtr->data); 
     sPtr=sPtr->nextNode; 
    } 

} printf("NULL\n\n"); 

} 
+1

OK, was ist das Problem? Sie haben bereits Funktionen, die die Liste iterieren, also ... Ich kann das Problem überhaupt nicht sehen :( –

+0

@MartinJames Ja, es klingt dumm, aber ich weiß nicht, wie ich die Funktion erstellen kann. Ich kann hinzufügen ein Fall 5. Aufruf der Funktion findFunction (& startNoiderPtr, integer) und Hinzufügen einer ganzzahligen Variable in der Struktur, und dann ?. Ich bin ein wenig verwirrt – Leandro

+1

Versuchen Sie vielleicht "Traverse verknüpfte Liste in C get Wert". Ich denke Sie Ich sollte mehr Mühe darauf verwenden, das Problem zu lösen, als nur zu sagen, dass er mein Problem ist. Kannst du es für mich tun? – sebenalern

Antwort

0

Sie haben es bereits grundsätzlich gelöst, das richtige Element finden, bis Sie nur die Anzahl der Iterationen rechnen müssen.

int search(struct ListNode *node, char data) { 
    int position = 1; 
    // List is empty 
    if (node == NULL) { 
     return -1; 
    } 
    while (node != NULL) { 
     if (node->data == data) { 
      return position; 
     } 
     position++; 
     node = node->nextNode; 
    } 
    // Element was not in the list 
    return -1; 
} 
+0

mmmh, es sieht gut aus, aber aus irgendeinem Grund gibt es mir einen Fehler. es heißt "unbekannter Typ Name ListNode" – Leandro

+0

@Leandro 'ListNode' ersetzen durch' struct ListNode' – BLUEPIXY

+0

@BLUEPIXY 'Fall 4: Suche (& startNodePtr, Wert); Pause; ' 'int Suche (ListNode * Knoten, char Daten)' es gibt mir Fehler, wenn ich die Funktion auf diese Weise aufrufen – Leandro

Verwandte Themen