次のコードは、各要素にライフタイム値を割り当てることができる二重リンクリストを実装しています。 insert
を呼び出すと、生涯が1
だけ減少します。ノードの寿命が0
であれば、そのノードはリストから削除されます。寿命値が負のノードは無視されるため、リストから削除されることはありません。
#include <stdio.h>
#include <stdlib.h>
struct dll{
struct node* head;
};
struct node {
struct node* next;
struct node* prev;
int value;
int lifetime;
};
void insert(struct dll*, int, int); // insert a new node
void step(struct dll*); // decrease the lifetime by one and remove "dead" nodes
void print(struct dll*); // print the nodes and their lifetime
int main(void) {
struct dll* dll = malloc(sizeof(struct dll));
dll->head = NULL;
insert(dll, 1, -1);
insert(dll, 2, 5);
insert(dll, 3, 3);
insert(dll, 4, 0);
insert(dll, 5, 1);
print(dll);
}
void insert(struct dll* dll, int value, int lifetime) {
print(dll);
step(dll);
struct node* n = malloc(sizeof(struct node));
n->value = value;
n->lifetime = lifetime;
if(dll->head == NULL) {
dll->head = n;
n->prev = dll->head;
n->next = dll->head;
} else {
n->prev = dll->head->prev;
dll->head->prev->next = n;
dll->head->prev = n;
n->next = dll->head;
}
}
void step(struct dll* dll) {
if(dll->head != NULL) {
struct node* n = dll->head;
do{
if(n->lifetime == 0) {
// remove the node
struct node* next = n->next;
n->prev->next = n->next;
n->next->prev = n->prev;
free(n);
n = next;
} else if(n->lifetime > 0){
// decrease lifetime by one
n->lifetime = n->lifetime - 1;
n = n->next;
} else {
n = n->next;
}
} while(n != dll->head);
}
}
void print(struct dll* dll) {
if(dll->head != NULL) {
struct node* n = dll->head;
do{
printf("%d(%d) ", n->value, n->lifetime);
n = n->next;
} while(n != dll->head);
}
printf("\n");
}
コードを実行時にプリントアウトされている次
1(-1)
1(-1) 2(5)
1(-1) 2(4) 3(3)
1(-1) 2(3) 3(2) 4(0)
1(-1) 2(2) 3(1) 5(1)
あなたの質問は何ですか? – MikeCAT
コードはどこですか? – jboockmann
@MikeCAT sir私はC言語で二重リンクされたリストでプロジェクトを実装しています。私はそれを事前定義する特定のステップ数の後に要素を自動的に削除したい(自動削除) – Nitin