//以下是list.h
#ifndef _LIST_H_
#define _LIST_H_
typedef struct _list{
char item[50];
struct _list *next;
}link_node;
typedef link_node *link_list;
int list_init(link_list *list);
int list_add_head(link_list *const head, const char *s);
int list_print(link_list *list,int begin, int num);
int list_add_tail(link_list* const head, const char *s);
int list_free( link_list* const list, const char *s);
int list_destroy(link_list* const list);
#endif
//以下是list.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "list.h"
link_list list;
link_list test;
int main(int argc, char*argv[])
{
list_init(&list);
list_add_tail(&list,"aaaa");
list_add_head(&list,"bbbb");
list_add_head(&list,"");
list_add_head(&list,"cccc");
list_add_tail(&list,"kkkk");
list_print(&list,0,15);
list_free(&list,"cccc");
list_print(&list,0,15);
list_destroy(&list);
list_print(&list,0,15);
list_free(&list," ");
list_print(&list,0,15);
list_init(&test);;
list_add_head(&test,"test");
list_print(&test,0,2);
return 0;
}
int list_init(link_list* const list)
{
*list = NULL;
return 0;
}
int list_add_head(link_list* const head, const char *s)
{
assert(s != NULL);
assert(strlen(s) <= 50);
link_list new_list;
new_list = (link_list)malloc(sizeof(link_node));
if(new_list == NULL)
return -1;
memset(new_list->item,0x0,sizeof(char[50]));
strcpy(new_list->item,s);
if((*head) == NULL)
{
(*head) = new_list;
new_list->next = NULL;
}
else
{
new_list->next = (*head);
*head = new_list;
}
return 0;
}
int list_add_tail(link_list* const head, const char *s)
{
assert(s != NULL);
assert(strlen(s) <= 50);
link_list new_list;
link_list p = (*head);
while(p != NULL && p->next != NULL)
p = p->next;
new_list = (link_list)malloc(sizeof(link_node));
if(new_list == NULL)
return -1;
memset(new_list->item,0x0,sizeof(char[50]));
strcpy(new_list->item,s);
if((*head) == NULL)
{
(*head) = new_list;
new_list->next = NULL;
}
else
{
p->next = new_list;
new_list->next = NULL;
}
return 0;
}
/*
begin=0代表第一个节点
*/
int list_print(link_list *list,int begin, int num)
{
link_list p = *list;
int count = 0;
while(p != NULL)
{
if(count >= begin && count <= num )
printf("%s\n",(p)->item);
p = p->next;
if(count == num)
break;
count ++;
}
printf("(%d)\n",count);
return 0;
}
int list_free( link_list* const list, const char *s)
{
assert(s != NULL);
assert(strlen(s) <= 50);
if(*list == NULL)
{
printf("list donot exit");
return -2;
}
link_list p = (*list);
link_list temp ;
while(p != NULL)
{
if(strcmp(s,p->item) == 0)
{
if(p == (*list)) //头结点,改变头指针
{
*list = p->next;
free(p);
return 0;//找到
}
else
{
temp->next = p->next;
free(p);
return 0;//找到
}
}
temp = p;
p = p->next;
}
return -1;//未找到
}
int list_destroy(link_list* const list)
{
link_list p;
link_list q;
p = *list;
while(p != NULL)
{
q = p;
p = p->next;
printf("destroy %s \n",q->item);
free(q);
}
*list = NULL;
return 0;
}
运行结果如下:
cccc
bbbb aaaa kkkk (5)
bbbb aaaa kkkk (4) destroy destroy bbbb destroy aaaa destroy kkkk (0) list donot exit(0) test (1)