backup-20240522-13h56
This commit is contained in:
parent
8081cf3951
commit
378205b741
162
list_singly.c
Normal file
162
list_singly.c
Normal file
|
|
@ -0,0 +1,162 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <strings.h>
|
||||||
|
|
||||||
|
typedef struct node {
|
||||||
|
void *content;
|
||||||
|
struct node *next;
|
||||||
|
}Node;
|
||||||
|
|
||||||
|
typedef struct slist {
|
||||||
|
Node *head;
|
||||||
|
size_t w;
|
||||||
|
}SList;
|
||||||
|
|
||||||
|
SList *new_slist(size_t w) {
|
||||||
|
SList *l = malloc(sizeof(SList));
|
||||||
|
l->head = NULL;
|
||||||
|
l->w = w;
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_empty(SList *l) {
|
||||||
|
return !l->head;
|
||||||
|
}
|
||||||
|
|
||||||
|
void delete_head(SList *l) {
|
||||||
|
Node *n = l->head;
|
||||||
|
//free(n->content);
|
||||||
|
l->head = n->next;
|
||||||
|
free(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroy_node(Node *n, Node *prev) {
|
||||||
|
//free(n->content);
|
||||||
|
prev->next = n->next;
|
||||||
|
free(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroy_list(SList *l) {
|
||||||
|
while (!is_empty(l))
|
||||||
|
delete_head(l);
|
||||||
|
free(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
void delete_node(Node *n, SList *l) {
|
||||||
|
Node *prev = l->head;
|
||||||
|
while (prev && prev->next != n)
|
||||||
|
prev = prev->next;
|
||||||
|
if (prev)
|
||||||
|
destroy_node(n, prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void delete_index(SList *l, int index) {
|
||||||
|
Node *prev, *n = l->head;
|
||||||
|
for (int i = 0; n && i < index; i++) {
|
||||||
|
prev = n;
|
||||||
|
n = n->next;
|
||||||
|
}
|
||||||
|
destroy_node(n, prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_len(SList *l) {
|
||||||
|
if (is_empty(l))
|
||||||
|
return 0;
|
||||||
|
int i = 1;
|
||||||
|
Node *n = l->head;
|
||||||
|
do {
|
||||||
|
n = n->next;
|
||||||
|
i++;
|
||||||
|
}while(n);
|
||||||
|
return i-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert_after(void *content, SList *l, Node *prev) {
|
||||||
|
Node *n = malloc(sizeof(Node));
|
||||||
|
n->content = content;
|
||||||
|
n->next = prev->next;
|
||||||
|
prev->next = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert_head(void *content, SList *l) {
|
||||||
|
Node *n = malloc(sizeof(Node));
|
||||||
|
n->content = content;
|
||||||
|
n->next = l->head;
|
||||||
|
l->head = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert_empty(void *content, SList *l) {
|
||||||
|
insert_head(content, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert(void *content, SList *l, int pos) {
|
||||||
|
if (is_empty(l) || !pos) {
|
||||||
|
insert_head(content, l);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Node *prev = l->head;
|
||||||
|
while(pos > 1 && prev) {
|
||||||
|
prev = prev->next;
|
||||||
|
pos--;
|
||||||
|
}
|
||||||
|
insert_after(content, l, prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void append(void *content, SList *l) {
|
||||||
|
if (is_empty(l)) {
|
||||||
|
insert_empty(content, l);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Node *prev = l->head;
|
||||||
|
while(prev->next)
|
||||||
|
prev = prev->next;
|
||||||
|
insert_after(content, l, prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
Node *find(void *content, SList *l, int (*cmp)(void *a, void *b)) {
|
||||||
|
Node *n = l->head;
|
||||||
|
while (cmp(n->content, content)) {
|
||||||
|
n = n->next;
|
||||||
|
if (!n)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_list(SList *l, void (*print_content)(void *content)) {
|
||||||
|
Node *n = l->head;
|
||||||
|
printf("[");
|
||||||
|
while(n) {
|
||||||
|
print_content(n->content);
|
||||||
|
printf(", ");
|
||||||
|
n = n->next;
|
||||||
|
}
|
||||||
|
printf("]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_content(void *c) {
|
||||||
|
printf("%d", *((int *)c));
|
||||||
|
}
|
||||||
|
|
||||||
|
int cmp(void *a, void *b) {
|
||||||
|
return *(int *)a - *(int *)b;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
SList *l = new_slist(sizeof(int));
|
||||||
|
int *a=malloc(sizeof(int)), *b=malloc(sizeof(int)), *c=malloc(sizeof(int)), *d=malloc(sizeof(int));
|
||||||
|
*a = 1; *b = 2; *c = 3; *d = 4;
|
||||||
|
append(a, l);
|
||||||
|
delete_head(l);
|
||||||
|
insert(a, l, 0);
|
||||||
|
append(b, l);
|
||||||
|
insert(c, l, 1);
|
||||||
|
insert(d, l, 0);
|
||||||
|
append(a, l);
|
||||||
|
printf("%d\n", get_len(l));
|
||||||
|
destroy_list(l);
|
||||||
|
free(a); free(b); free(c); free(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user