#include <stdio.h>
#include <stdlib.h>
//数据类型
typedef int ElemType;
//节点存储结构, 头结点用来存储长度
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef Node *PtrToNode;
//节点指针
typedef PtrToNode Position;
//链表
typedef PtrToNode List;
//链表初始化,对头结点进行初始化,数据域存储链表长度
void Init(List *l)
{
(*l) = (Position)malloc(sizeof(Node));
if((*l) == NULL) exit(0);
(*l) -> next = NULL;
(*l) -> data = 0;
}
//链表是否为空
int IsEmpty(List l)
{
return l -> next == NULL;
}
//节点是否拥有下一个元素
int IsLast(Position p)
{
return p -> next == NULL;
}
//获取链表长度
int Length(List l)
{
return l -> data;
}
//查找节点
Position Find(ElemType data, List l)
{
Position p = l -> next;
while(p != NULL && p -> data != data)
{
p = p -> next;
}
return p;
}
//查找前一个节点
Position FindPrevious(ElemType data, List l)
{
Position p = l;
while(p -> next != NULL && p -> next -> data != data)
{
p = l -> next;
}
return p;
}
//查找最后一个节点
Position FindLast(List l)
{
Position p = l;
while(p -> next != NULL)
{
p = p -> next;
}
return p;
}
//添加
Position Add(ElemType data, List l)
{
Position p = (Position)malloc(sizeof(Node));
if(p == NULL) exit(0);
p -> data = data;
p -> next = NULL;
Position lastP = FindLast(l);
lastP -> next = p;
l -> data++;
return p;
}
//执行插入
void Insert(ElemType data, List l, Position p)
{
Position tempCell = (Position)malloc(sizeof(Node));
if(tempCell == NULL) exit(0);
tempCell -> data = data;
tempCell -> next = p -> next;
p -> next = tempCell;
l -> data++;
}
//执行删除
void Delete(List l, Position p)
{
if(p == NULL) return;
Position tmpCell = p -> next;
p -> next = tmpCell -> next;
free(tmpCell);
l -> data--;
}
//清空链表
void Empty(List l)
{
Position p = l -> next;
Position f;
while(p != NULL)
{
f = p -> next;
free(p);
p = f;
l -> data--;
}
l -> next = NULL;
}
int main(void)
{
List l;
Init(&l);
Position p = Add(3, l);
printf("%d, %d\n", Length(l), p -> data);
Position p2 = FindPrevious(3, l);
Insert(2, l, p2);
//Position p3 = Find(2, l);
Position p4 = FindLast(l);
printf("%d, %d\n", Length(l), p4 -> data);
Delete(l, p2);
printf("%d, %d\n", Length(l), l -> next -> data);
Empty(l);
printf("%d, %d\n", Length(l), l -> data);
return 0;
}