Удаление узлов в связанном списке - PullRequest
0 голосов
/ 27 ноября 2011

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

Моя программа запрашивает письмо для удаления, например.Привет хранится в списке, пользователь вводит H для удаления, так что теперь список ello В данный момент с моим кодом, программа вылетает, очевидно, как если бы H был удален, нет заголовка, и программа не знаетгде искать этот список.

Ниже приведена моя текущая реализация, любые подсказки или подсказки о том, как изменить этот код (я хотел бы, чтобы он был похож на мой), чтобы разрешить удаление узла узлаочень цениться!.

РЕДАКТИРОВАТЬ: В ответ на ниже

FullList DeleteNode(FullList temp, char c) {
FullList remember;
FullList ptr;
while (temp.head->c != c) {
    remember.head = temp.head;
    temp.head = temp.head->next;
}
ptr.head = temp.head->next;
free(temp.head);
remember.head->next = ptr.head;
return temp;
}

int main(void) {
FullList List;
char c, s;
List.head = NULL;

while ((c=getchar()) != '.') {
    List = addToEnd(List, c);
}
scanf(" %c", &s);
List = DeleteNode(List, s);
while (List.head != NULL) {
    printf("%c", List.head->c);
    List.head = List.head->next;
}
return 0;
}

typedef struct List {
 char c;
 struct List *next;
}List;

typedef struct {
 List *head;
 List *tail;
}FullList;

 List *insertList(char c, List *t1) {
  List *t = (List*)calloc(1, sizeof(List));
  t->c = c ;
  t->next = t1;
 return t;
 }

FullList addToEnd(FullList c, char element) {
 if (c.head == NULL) { 
    c.head = c.tail = insertList(element, NULL);
 }else {
    c.tail->next = insertList(element, NULL);
    c.tail = c.tail->next;
 }
 return c;
} 

void DeleteNode(FullList temp, char c) {
 FullList remember;
 FullList ptr;
 while (temp.head->c != c) {
    remember.head = temp.head;
    temp.head = temp.head->next;
 } 
 ptr.head = temp.head->next;
 free(temp.head);
 remember.head->next = ptr.head;
} 


int main(void) {
 FullList List;
 char c, s;
 List.head = NULL;

 while ((c=getchar()) != '.') {
    List = addToEnd(List, c);
 }
 scanf(" %c", &s);
 DeleteNode(List, s);
 while (List.head != NULL) {
    printf("%c", List.head->c);
    List.head = List.head->next;
 }
 return 0;
}

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

Вы не можете сделать это, не изменив существующий код.

Вы передаете структуру FullList своей функции DeleteNode().Это означает, что любые изменения в этой структуре не видны в main - функция получает копию .

Вам потребуется изменить DeleteNode(), чтобы принять указатель:

void DeleteNode(FullList *temp, char c)

Затем при вызове main() вы должны сделать:

DeleteNode(&List, s);

ДелаяТаким образом, вы можете изменить значение temp->head в вашей функции, и оно будет отображаться в main()

temp->head = temp->head->next;

Редактировать: Логика вам нужна:

  • Проверьте, если temp->head->c == c
  • Если да, замените temp->head на temp->head->next
  • , иначе присвойте temp->head временному указателю *previous,Присвойте temp->head->next указателю *current.Перемещайтесь по списку, перемещая оба указателя.Когда вы найдете совпадение в current->c, присвойте current->next previous->next и free() узлу current.
1 голос
/ 27 ноября 2011

Теперь, внутри DeleteNode, когда вы изменяете аргумент, изменяется только локальная переменная, а не та, которая находится вне функции.

Вы должны либо передать указатель FullList на DeleteNode, чтобы изменения, сделанные в нем, были видимы для вызывающей стороны, либо изменить локальную и вернуть ее, и вызывающая сторона должна присвоить возвращенную FullList к его списку.

В любом случае, изменения, сделанные с помощью DeleteNode, должны стать видимыми для вызывающей стороны.

...