2016-10-20 3 views
1

не удается удалить узел в одиночном списке

У меня возникла проблема с удалением узла с указанным символом в связанном списке. Программа принимает аргументы командной строки, объединяет их в одну строку и добавляет каждый символ в связанный список как узел.

Когда я пытаюсь удалить символ «a» с аргументом командной строки «mango», он отлично работает, т. Е. Успешно удаляет второй узел. когда я пытаюсь сделать то же самое с «оранжевым», программа не удаляет его ... означает, что программа не может работать с третьими и более удаленными узлами.

Программа не должна использовать глобальные переменные, поэтому я использовал двойной указатель. Все функции работают исправно, эта проблема может возникнуть из-за некоторых ошибок в функции locate() и deleteChar(), но я не могу понять, что это за ошибка.

Можно ли решить эту проблему, используя двойной указатель ?? я не могу понять, что это неправильно в этой программе .. Я новичок в программирования C, пожалуйста, помогите мне с этим .. Пожалуйста, исправить меня .. Заранее спасибо ..

код приведен ниже:

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

struct linkedList { 
    char ch; 
    struct linkedList *node; 
}; 

char* combineWithNoSpaces(int, char *[]); 
void addTolinkedList(char *, struct linkedList **, int *); 
void displayWithNoSpaces(struct linkedList **); 
struct linkedList *locate(struct linkedList**); 
void deleteChar(struct linkedList**); 


int main(int argc, char *argv[]) { 
    /*some variables*/ 
    char *str; 
    struct linkedList *s; 
    int indexer = 0; 
    /*add data from arguments to linked list combine arguments with no spaces 
    * as a single string 
    */ 
    s = (struct linkedList *) malloc(sizeof(struct linkedList)); 
    str = combineWithNoSpaces(argc, argv); 
    addTolinkedList(str, &s, &indexer); 
    /*diaplay the added data to linked list with no spaces */ 
    printf("your combined argument is \n"); 
    displayWithNoSpaces(&s); 
    printf("\n"); 
    /* Delete specified character */ 
    printf("Now Deleting the node with specified character : \n"); 
    deleteChar(&s); 
    /* Display the data after deleting */ 
    printf("Displaying after deleting..\n"); 
    displayWithNoSpaces(&s); 
    printf("\n"); 
    return 0; 
} 
int i = 0; 

struct linkedList *locate(struct linkedList **s){ 
    if((*s)->node->ch == 'a'){ 
     return *s; 
    } 
    else if((*s)->node!=NULL){ 
     locate(&((*s)->node)); 
    } 
    return NULL; 
} 
void deleteChar(struct linkedList **s){ 
    struct linkedList *temp, *tag; 
    tag = locate(s); 
    if(tag!= NULL){ 
     temp = tag->node->node; 
     free(tag->node); 
     tag->node = temp; 
    } 
} 
void displayWithNoSpaces(struct linkedList **s) { 
    if ((*s) != NULL) { 
     printf("%c", (*s)->ch); 
     displayWithNoSpaces(&(*s)->node); 
    } 
    return; 
} 
void addTolinkedList(char *str, struct linkedList **s, int *indexer) { 
    if (*indexer == strlen(str)) { 
     *s = NULL; 
     return; 
    } else { 
     (*s)->ch = *(str + *indexer); 
     (*s)->node = (struct linkedList *) malloc(sizeof(struct linkedList)); 
     ++*indexer; 
     addTolinkedList(str, &(*s)->node, indexer); 
    } 
} 
char * combineWithNoSpaces(int argc, char *argv[]) { 
    int i, j; 
    int count = 0; 
    int memory = 0; 
    char *str; 
    for (i = 1; i < argc; i++) { 
     for (j = 0; j < strlen(argv[i]); j++) { 
      ++memory; 
     } 
    } 
    str = (char *) malloc(memory * sizeof(char)); 
    for (i = 1; i < argc; i++) { 
     for (j = 0; j < strlen(argv[i]); j++) { 
      *(str + count) = argv[i][j]; 
      ++count; 
     } 
    } 
    return str; 
} 

выход также приведен ниже: sample output

+0

Возможная Дубликат [C программирования Linked Lists удалить узел в положении N] (http://stackoverflow.com/questions/5011990/c-programming-linked-lists-delete-node-at-position-n) – progyammer

+0

Поверьте мне, что это не дубликат progy_rock, функция locate() не возвращает указатель структуры правильно или я не могу правильно принять возвращаемый указатель структуры .. кроме того, он имеет дело с двойным указателем .. Я не получаю никакой помощи от каких-либо источник .. – user3213732

+0

Почему вы рекурсивно размещаете? –

ответ

2

в коде, чтобы найти узел, который вы хотите удалить, у вас есть такие строки:

else if((*s)->node!=NULL){ 
    locate(&((*s)->node)); 
} 
return NULL; 

Здесь вы вызываете locate рекурсивно, но вы фактически не возвращаете результат этого вызова, вместо этого вы всегда будете возвращать NULL.

Вы должны изменить его

else if((*s)->node!=NULL){ 
    return locate(&((*s)->node)); // Return result of recursive call 
} 
return NULL; 
+0

черт возьми, вы быстро ... Рекурсия казалась мне подозрительной, но я не был уверен, что это было неправильно до сих пор, а затем я вижу, что это уже сделано ... –

+0

Действительно, Иоаким сэр, ты произвел на меня такой быстрый ответ. вы просто великолепны, и я уважаю ваши глубокие знания .. Пожалуйста, предложите мне несколько советов для того, чтобы быть совершенным, как вы в программировании c .. Большое спасибо sir .. – user3213732

+0

@ user3213732 Experience. Программирование почти каждый день так или иначе в течение примерно 30 лет, как правило, дает большой опыт. Ты получишь это однажды. :) –

0

A двойной указатель связанный список, как правило, означает, что у вас есть массив связанных списков. В вашем коде было несколько проблем с рекурсией в locate (...). Вот ваш код, отредактированный так, что у вас есть только один указатель на связанный список с элементом «head». Ура!

#include <iostream> 

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

struct linkedList { 
    char ch; 
    struct linkedList *node; 
}; 


char* combineWithNoSpaces(int, char *[]); 
void addTolinkedList(char *, struct linkedList *, int *); 
void displayWithNoSpaces(struct linkedList *); 
struct linkedList *locate(struct linkedList*); 
void deleteChar(struct linkedList*); 

struct linkedList *createlist(); 





struct linkedList* createlist() 
{ 

    struct linkedList* head = (struct linkedList*) malloc(sizeof(struct linkedList)); 
head->node = NULL; 
return head; 



} 

int main(int argc, char *argv[]) { 
/*some variables*/ 
char *str; 

int indexer = 0; 
/*add data from arguments to linked list combine arguments with no spaces 
* as a single string 
*/ 
struct linkedList* head = createlist(); 
str = combineWithNoSpaces(argc, argv); 
addTolinkedList(str, head, &indexer); 
/*diaplay the added data to linked list with no spaces */ 
printf("your combined argument is \n"); 
displayWithNoSpaces(head); 
printf("\n"); 
/* Delete specified character */ 
printf("Now Deleting the node with specified character : \n"); 
deleteChar(head); 
/* Display the data after deleting */ 
printf("Displaying after deleting..\n"); 
displayWithNoSpaces(head); 
printf("\n"); 
return 0; 
} 

struct linkedList *locate(struct linkedList *head){ 

if (head->node == NULL) return NULL; 
if(head->node->ch == 'a'){ 
    return head; 
} 

return locate(head->node); 

} 
void deleteChar(struct linkedList *head){ 
struct linkedList *temp, *tag; 
tag = locate(head); 
if(tag!= NULL){ 
    temp = tag->node->node; 
    free(tag->node); 
    tag->node = temp; 
} 
} 

void displayWithNoSpaces(struct linkedList *head) { 
if (head->node != NULL) { 
    printf("%c", head->node->ch); 
    displayWithNoSpaces(head->node); 
} 
return; 
} 
void addTolinkedList(char *str, struct linkedList *head, int *indexer) { 
if (*indexer == strlen(str)) { 
    head->node = NULL; 
    return; 
} else { 
    head->node = (struct linkedList *) malloc(sizeof(struct linkedList)); 
    head->node->ch = *(str + *indexer); 

    ++*indexer; 
    addTolinkedList(str,head->node, indexer); 
} 
} 
char * combineWithNoSpaces(int argc, char *argv[]) { 
int i, j; 
int count = 0; 
int memory = 0; 
char *str; 
for (i = 1; i < argc; i++) { 
    for (j = 0; j < strlen(argv[i]); j++) { 
     ++memory; 
    } 
} 
str = (char *) malloc(memory * sizeof(char)); 
for (i = 1; i < argc; i++) { 
    for (j = 0; j < strlen(argv[i]); j++) { 
     *(str + count) = argv[i][j]; 
     ++count; 
    } 
} 
return str; 
} 
Смежные вопросы