单链表

/*
 * 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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值