List.h如下:
#ifndef __LIST_H
#define __LIST_H
typedef struct Node
{
int data;
struct Node *next;
}Node, *List;
void InitList(List list);
bool Insert_Head(List list, int val);
bool Insert_Tail(List list, int val);
Node *Search(List list, int key);
Node *SearchPre(List list, int key);//查找key的前驱
bool Delete(List list, int key);
int Length(List list);//返回链表的数据节点个数
void Show(List list);
void Destroy(List list);//删除list所有数据节点
#endif
List.c如下:
#include "List.h"
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
static Node *BuyNode(int val)
{
Node *p = (Node*)malloc(sizeof(Node));
assert(p != NULL);
p->data = val;
p->next = NULL;
return p;
}
void InitList(List list)
{
assert(list != NULL);
list->next = NULL;//(*list).next = NULL;
}
bool Insert_Head(List list, int val)
{
//Node node;//error
//node.data = val;
//node.next = list->next;
//list->next = &node;
Node *p = BuyNode(val);
p->next = list->next;
list->next = p;
return true;
}
bool Insert_Tail(List list, int val)
{
Node *p = list;
while (p->next != NULL)
{
p = p->next;
}
p->next = BuyNode(val);
return true;
//p=list->next;//NULL
//while(p!=NULL)
//{
// p = p->next;
//}
//p++;
}
Node *Search(List list, int key)
{
for (Node *p = list->next; p != NULL; p = p->next)
{
if (p->data == key)
{
return p;
}
}
return NULL;
}
Node *SearchPre(List list, int key)//查找key的前驱
{
for (Node *p = list; p->next != NULL; p = p->next)
{
if (p->next->data == key)
{
return p;
}
}
return NULL;
}
bool Delete(List list, int key)
{
Node *p = SearchPre(list, key);
if (p == NULL)
{
return false;
}
Node *q = p->next;
p->next = q->next;
free(q);
//free(p->next);//error
//p->next = p->next->next;
return true;
}
int Length(List list)//返回链表的数据节点个数
{
int count = 0;
for (Node *p = list->next; p != NULL; p = p->next)
{
count++;
}
return count;
}
void Show(List list)
{
for (Node *p = list->next; p != NULL; p = p->next)
{
printf("%d ", p->data);
}
printf("\n");
}
void Destroy(List list)//删除list所有数据节点
{
while (list->next != NULL)
{
Node*p = list->next;
list->next = p->next;
free(p);
}
/*
Node *p = list->next;
Node *q;
list->next = NULL;
while(p!=NULL)
{
q = p->next;
free(p);
p = q;
}
*/
}