天天看點

簡單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

繼續閱讀