2016-06-22 17 views
0

In meinen Hausaufgaben wurde ich gebeten, einen bestimmten Knoten nach seinem Namensfeld in einen bestimmten Index zu verschieben. Ich habe Probleme herauszufinden, warum meine Liste zu einer unendlichen Liste wird. Das Problem liegt in der Funktion "changePlacement"
Beispiel:
Gegebene verknüpfte Liste: 1-> 2-> 3-> 4
Ausgabe: 1-> 3-> 3-> 3 ...
Erwartete Ausgabe: 1-> 3-> 2-> 4Verlagern eines Knotens in einer einzelnen verknüpften Liste Erstellt Endlosschleife

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

struct Frame 
{ 
    char   *name; 
    unsigned int duration; 
    char   *path; // may change to FILE* 
}; 
typedef struct Frame frame_t; 

struct Link 
{ 
    frame_t *frame; 
    struct Link *next; 
}; 
typedef struct Link link_t; 

int listLen = 0; 
link_t* lastNode = NULL; 

void addFrame(link_t** list); 
void frameData(frame_t* frame); 
void freeVideo(link_t* video); 
void showList(link_t* list); 
void freeNode(link_t* list); 
void changePlacement(link_t** list, int newIndex, char* name); 

int main(void) 
{ 
    link_t* video = NULL; 
    lastNode = video; 
    if (!video) 
    { 
     perror(video); 
    } 
    addFrame(&video); 
    addFrame(&video); 
    addFrame(&video); 
    addFrame(&video); 

    showList(video); 
    changePlacement(&video, 2, "3"); 
    showList(video); 
    printf("\n"); 
    freeVideo(&video); 

    _flushall(); 
    getchar(); 
    return 0; 
} 



void addFrame(link_t** video) 
{ 
    char strTemp[200] = { 0 }; 

    link_t* newFrame = (link_t*) calloc(1, sizeof(link_t)); 
    newFrame->frame = (frame_t*) malloc(sizeof(frame_t)); 

    printf("     *** Creating new frame ***\n"); 
    printf("Please insert a frame path:\n"); 
    scanf(" %s", &strTemp); 
    newFrame->frame->path = (char*) calloc(strnlen(strTemp, 200) + 1, sizeof(char)); 
    strncpy(newFrame->frame->path, strTemp, strnlen(strTemp, 200)); 

    printf("Please insert frame duration(in miliseconds):\n"); 
    scanf(" %d", &(newFrame->frame->duration)); 

    printf("Please choose a name for that frame:\n"); 
    scanf(" %s", &strTemp); 
    newFrame->frame->name = (char*) calloc(strnlen(strTemp, 200) + 1, sizeof(char)); 
    strncpy(newFrame->frame->name, strTemp, strnlen(strTemp, 200)); 

    if (!(*video)) 
    { 
     (*video) = newFrame; 
    } 
    else 
    { 
     lastNode->next = newFrame; 
    } 
    lastNode = newFrame; 


    ++listLen; 
} 




void freeVideo(link_t** video) 
{ 
    link_t* currNode = NULL; 
    int loop = 0; 

    for (; currNode; currNode = *video) // set curr to head, stop if list empty. 
    { 
     // advance head to next element. 
     freeNode(currNode); 
     (*video) = (*video)->next; // delete saved pointer. 
    } 
    freeNode((*video)->next); 
    freeNode((*video)); 


} 


void showList(link_t* list) 
{ 
    printf("\n\t|Name\t\t| Duration |  Path\n"); 
    printf("\t+++++++++++++++++++++++++++++++++++++++++++++++\n"); 
    for (;list; list = list->next) 
    { 
     printf("\t|%10s\t|%10d\t|\t%s\n", list->frame->name, list->frame->duration, list->frame->path); 
     printf("\t+++++++++++++++++++++++++++++++++++++++++++++++\n"); 
    } 
} 

void freeNode(link_t* node) 
{ 
    free(node->frame->name); 
    free(node->frame->path); 
    free(node->frame); 
    free(node); 
} 

void changePlacement(link_t** list, int newIndex, char* name) 
{ 
    link_t *prevOldNode = (*list), *prevTemp = NULL, *oldNode = NULL, *newNode = NULL; 
    link_t *temp = (*list), *PrevNewNode = NULL, *nodeAfterNewNode = NULL; 
    int currIndex = 0, i = 0, flag = 0; 

    while ((temp->next)) 
    { 
     ++currIndex; 
     if (!strcmp(temp->frame->name, name)) //looking for the wanted node 
     { 
      oldNode = temp; 
      prevOldNode = prevTemp; 
     } 
     if (currIndex == newIndex) 
     { 
      PrevNewNode = prevTemp; 
      newNode = temp; 
     } 
     prevTemp = temp; 
     temp = temp->next; 
    } 
    nodeAfterNewNode = newNode->next; //temporal variable that stores the node after the new node 
    prevOldNode->next = oldNode->next; 
    newNode->next = oldNode; 

    oldNode->next = nodeAfterNewNode; 
} 

haben Sie irgendwelche Ideen haben, nachdem auf meinen Code suchen? jede mögliche Hilfe würde gesegnet sein

+0

Beginnen Sie mit Ihren Warnungen zu befestigen. Dann poste den Code * in deine Frage *. Links können sterben (und tatsächlich zählen einige tatsächlich darauf), was die Frage für zukünftige Leser unbrauchbar macht. – WhozCraig

+0

Danke, bearbeitet :) – ilanDazanashvili

+0

Großartig, aber [die Warnungen (und tatsächlich, Fehler) bestehen immer noch] (http://pastebin.com/hzixMP7u). Sie müssen Ihre Warnstufen auf pedantische Ebenen Ihres Compilers setzen und * alle * die identifizierten Probleme adressieren. Selbst dann gibt es einige Dinge, die der Compiler * nicht * fangen wird, der Fehler in Ihrem 'freeVideo' zum Beispiel, der aufgrund einer inkorrekten Initialisierung nichts außer den ersten beiden Knoten freigibt. Ein ** Debugger ** scheint ideal, um diese Probleme zu lösen, einschließlich Ihrer Endlosschleife, und ehrlich gesagt, das ist der nächste Schritt nach dem Reparieren Ihrer Warnungen/Fehler. – WhozCraig

Antwort

0

Ihr Code am Ende changePlacement() berücksichtigt nicht den Fall von oldNode und newNode, die nebeneinander sind, ich. e. e. G. nodeAfterNewNode = newNode->next ist identisch mit oldNode. (Außerdem ist es nicht für den Fall verantwortlich, den Namen nicht zu finden.) Es ist viel einfacher, einfach die frame Zeiger auszutauschen; ändern

nodeAfterNewNode = newNode->next; //temporal variable that stores the node after the new node 
    prevOldNode->next = oldNode->next; 
    newNode->next = oldNode; 

    oldNode->next = nodeAfterNewNode; 

zu

if (!oldNode) return; // wanted node name not found 
    frame_t *f = oldNode->frame; 
    oldNode->frame = newNode->frame; 
    newNode->frame = f;