私は、以下のリンクリストの実装があります。私は、このリンクリストにこの機能を実行した2つのインデックス間のリンクリストのノードを削除するにはどうすればよいですか?
void deleteList(struct _list *list, int from, int to) {
int i;
assert(list != NULL);
// I skipped error checking for out of range parameters for brevity of code
for (i = from; i <= to; i++) {
deleteNode(list->head, i);
}
}
//::このような[First]->[Second]->NULL
を
struct _node {
char *string;
struct _node *next;
}
struct _list {
struct _node *head;
struct _node *tail;
}
私は次の関数を作りたいのdeleteNodes(list, 1, 1)
2行目を削除して [First]->[Second]->NULL
を取得しましたが、このように実行するとdeleteList(list, 0, 1)
と入力します[First]->[Second]->[Third]->NULL
私はsegの欠陥を得る。
void pop(struct _node *head) {
if (head == NULL) {
return;
}
struct _node *temp = head;
head = head->next;
free(temp);
}
が、それは私がワンセグ障害与えますか:ここで
は私のdeleteNode機能は、私がもしまたは0 =へのリンクリストの先頭を削除するには、別の関数を書いた
void deleteNode(struct _node *head, int index) {
if (head == NULL) {
return;
}
int i;
struct _node *temp = head;
if (index == 0) {
if (head->next == NULL) {
return;
}
else {
head = head->next;
free(head);
return;
}
}
for (i = 0; temp!=NULL && i<index-1; i++) {
temp = temp->next;
}
if (temp == NULL || temp->next == NULL) {
return;
}
Link next = temp->next->next;
free(temp->next);
temp->next = next;
}
ですメモリエラートラップを中止します。6.
あなたあなたのループ'deleteNode'の呼び出しには欠陥があります:範囲内の最初のノードを削除すると、削除する次のノードは以前と同じインデックスを持ちません。 –
もちろん!だから私は新しい頭部へのポインタを保持する必要がありますか?それとも全く別のアプローチをとるべきですか? – user6005857
単純な解決策は、ループを逆にして、最初の範囲の最後のノードを削除し、最後に最後のノードを削除するなどです。 –