天天看点

简单list举例

作者:编码小哥

合并2个list,代码实现如下:

list.c

#include "list.h"

#include <assert.h>

#include <stdarg.h>

#include <stddef.h>

#include <stdio.h>

#include <stdlib.h>

#define L List_T

/* Initial list */

L List_init(void)

{

L list;

list = (L)malloc(sizeof(L));

list->next = NULL;

return list;

}

/* Push an element into top of the list */

L List_push(L list, void *val)

{

L new_elem = (L)malloc(sizeof(L));

new_elem->val = val;

new_elem->next = list;

return new_elem;

}

/* Length of list */

int List_length(L list)

{

int n;

for (n = 0; list; list = list->next) n++;

return n;

}

/* Convert list to array */

void **List_toArray(L list)

{

int i, n = List_length(list);

void **array = (void **)malloc((n + 1) * sizeof(*array));

for (i = 0; i < n; i++)

{

array[i] = list->val;

list = list->next;

}

array[i] = NULL;

return array;

}

/* Create and return a list */

L List_list(L list, void *val, ...)

{

va_list ap;

L *p = &list;

va_start(ap, val);

for (; val; val = va_arg(ap, void *))

{

*p = malloc(sizeof(L));

(*p)->val = val;

p = &(*p)->next;

}

*p = NULL;

va_end(ap);

return list;

}

/* Append 2 lists together */

L List_append(L list, L tail)

{

L *p = &list;

while ((*p)->next)

{

p = &(*p)->next;

}

*p = tail;

return list;

}

list.h

#ifndef __LIST__

#define __LIST__

#define L List_T

typedef struct L *L;

struct L

{

void *val;

L next;

};

extern L List_init(void);

extern L List_push(L list, void *val);

extern int List_length(L list);

extern void **List_toArray(L list);

extern L List_append(L list, L tail);

extern L List_list(L list, void *val, ...);

/* TODO */

extern L List_copy(L list);

extern int List_pop(L *list);

#undef L

#endif

main.c

#include <assert.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "list.h"

void print_list(char **array)

{

int i;

for (i = 0; array[i]; i++) printf("%s", array[i]);

printf("\n");

}

int main()

{

List_T list1, list2, list3;

char **str1 = (char **)malloc(100 * sizeof(char *));

list1 = List_init();

list1 = List_push(list1, "Dang ");

list1 = List_push(list1, "Hoang ");

list1 = List_push(list1, "Hai ");

printf("List 1: ");

str1 = (char **)List_toArray(list1);

print_list(str1);

list2 = List_init();

list2 = List_list(list2, "Mentor ", "Graphics ", "Siemens", NULL);

printf("List 2: ");

print_list((char **)List_toArray(list2));

list3 = List_append(list1, list2);

printf("Test append list2 into list1: ");

print_list((char **)List_toArray(list3));

return 0;

}

Makefile

CC = gcc

CFLAGS = -g -c -Wall

all: main

main: main.o list.o

$(CC) -g main.o list.o -o main

list.o: list.c

$(CC) $(CFLAGS) list.c

clean:

rm *o main

运行结果

简单list举例

result

3个C库的宏:va_start、va_arg、va_end

void va_start(va_list ap, last_arg) 初始化 ap 变量,它与 va_arg 和 va_end 宏是一起使用的。last_arg 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。

这个宏必须在使用 va_arg 和 va_end 之前被调用。

声明

下面是 va_start() 宏的声明。

void va_start(va_list ap, last_arg);

参数

ap -- 这是一个 va_list 类型的对象,它用来存储通过 va_arg 获取额外参数时所必需的信息。

last_arg -- 最后一个传递给函数的已知的固定参数。

返回值

NA

上一篇: p2psim 学习
下一篇: p2psim:howto

继续阅读