/*
* Copyright 2014 YU Heng-yang. All rights reserved.
*
* slist.c - Single linked list.
*
* Modify data to any other types as you like, note also
* the function interfaces and data compare function.
*
* 2014-7-6 YU Heng-yang.
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define ALLOC(size) malloc(size)
#define FREE(p) free(p)
typedef struct List *List;
struct List {
int data;
List next;
};
List list_new(void);
List list_append(List list, int data);
List list_prepend(List list, int data);
List list_find(List list, int data);
List list_delete(List list, int data);
List list_destroy(List list);
void list_traversal(List list, void (*apply) (List, void *arg), void *arg);
static void print(List list, void *arg)
{
printf((char *)arg, list->data);
}
int main(int argc, char *argv[])
{
#define N 5
int i, n;
List list = list_new();
for (i = 0; i < N; i++) {
scanf("%d", &n);
if (i == N - 1)
list = list_prepend(list, n);
else
list = list_append(list, n);
printf("After insert %d: ", n);
list_traversal(list, print, "%d ");
putchar('\n');
}
for (i = 0; i < N; i++) {
scanf("%d", &n);
if (list_find(list, n))
list = list_delete(list, n);
printf("After delete %d: ", n);
list_traversal(list, print, "%d ");
putchar('\n');
}
list = list_destroy(list);
assert(NULL == list);
assert(NULL == list_find(list, 1000));
assert(NULL == list_delete(list, 10));
return 0;
}
List list_new(void)
{
return NULL;
}
List list_append(List list, int data)
{
List *pp, p;
for (pp = &list; *pp; pp = &(*pp)->next)
;
p = ALLOC(sizeof(*p));
p->data = data;
p->next = NULL; /* i.e. p->next = *pp */
*pp = p;
return list;
}
List list_prepend(List list, int data)
{
List p = ALLOC(sizeof(*p));
p->data = data;
p->next = list;
list = p;
return list;
}
static List *list_do_find(List list, int data)
{
List *pp;
for (pp = &list; *pp; pp = &(*pp)->next)
if ((*pp)->data == data)
break;
return pp;
}
List list_find(List list, int data)
{
return *list_do_find(list, data);
}
List list_delete(List list, int data)
{
List *pp = list_do_find(list, data);
List p;
if ((p = *pp)) { /* assignment */
if (list->data == data) /* first element? */
list = list->next;
else
*pp = p->next;
FREE(p);
}
return list;
}
List list_destroy(List list)
{
List p;
for (p = list; p; p = list) {
list = p->next;
FREE(p);
}
return NULL;
}
void list_traversal(List list, void (*apply) (List , void *arg), void *arg)
{
for (; list; list = list->next)
apply(list, arg);
}
单链表
最新推荐文章于 2023-05-06 22:43:40 发布