#include<stdio.h>
#include<stdlib.h>
typedef int ElementType ; // ElementType 可以定义为其他类型
struct Node
{
ElementType Element;
struct Node *Next;
};
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
void Print(List L); // 遍历整个链表
int IsEmpty(List L); // 判断是不是空表
int IsLast(Position P,List L); // 判断是不是最后一个节点
Position Find(ElementType X, List L); // 在链表中查找X,返回X的地址 否则返回NULL
void Delete (ElementType X, List L); // 删除X
Position FindPrevious (ElementType X, List L); // 查找X的前驱
void Insert(ElementType X,int i,List L); // 在第i个节点后插入 X
void DeleteList(List L); // 删除整个链表, 不包括头节点
Position Creat(void); // 创建空表
int main(void)
{
int i,t;
int a[10] = { 1,2,3,4,5,6,7,8,9,10};
Position L,T;
L = Creat();
for( i = 0; i < 10; i++)
{
Insert(a[i] ,i ,L);
}
// 以下几个是测试函数
// Delete(5,L);
// Delete(10,L);
// Delete(1,L);
// DeleteList( L);
// T = Find(5,L);
// printf("%d",T->Element);
// t = IsEmpty(L);
// printf("%d",t);
Print(L);
free(L);
return 0;
}
int IsEmpty(List L) // 测试一个表是否为空表
{
return L->Next == NULL;
}
int IsLast(Position P,List L) // 测试当前位置是否为链表的结尾
{
return P->Next == NULL;
}
Position Find(ElementType X, List L) // 在链表中查找X,返回X的地址 否则返回NULL
{
Position P;
P = L->Next;
while( P != NULL && P->Element != X)
{
P = P->Next;
}
return P;
}
void Delete (ElementType X, List L) // 删除X
{
Position P,TmpCell;
P = FindPrevious( X, L); // 找到X的前驱
if( !IsLast(P,L)) // 如果前驱为Last,表明链表中没有该元素
{
TmpCell = P->Next;
P->Next = TmpCell->Next;
free(TmpCell);
}
}
Position FindPrevious (ElementType X, List L) // 如果该元素为第一个返回头结点
{ //如果该元素不在链表中返回最后一个节点
Position P;
P = L;
while( P->Next != NULL && P->Next->Element != X)
{
P = P->Next;
}
return P;
}
void Insert(ElementType X,int i,List L) // 在第i个节点后面插入X
{
Position P,S;
int j = 0;
P = L;
while( P && j <= i -1 )
{
P = P->Next;
j++;
}
S =(Position) malloc(sizeof(Node));
if( !S)
printf("Insert error!");
else
{
S->Element = X;
S->Next = P->Next;
P->Next = S;
}
}
void DeleteList(List L) // 删除整个链表, 不包括头节点
{
Position P,Tmp;
P = L->Next;
L->Next = NULL;
while(P)
{
Tmp = P->Next;
free(P);
P = Tmp;
}
}
Position Creat(void) // 创建空表 ,返回空表的头指针
{
L->Next = NULL;
return L;
}
void Print(List L) // 遍历整个链表
{
Position P;
P = L->Next;
while(P)
{
printf("%d",P->Element);
P = P->Next;
}
}
#include<stdlib.h>
typedef int ElementType ; // ElementType 可以定义为其他类型
struct Node
{
ElementType Element;
struct Node *Next;
};
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
void Print(List L); // 遍历整个链表
int IsEmpty(List L); // 判断是不是空表
int IsLast(Position P,List L); // 判断是不是最后一个节点
Position Find(ElementType X, List L); // 在链表中查找X,返回X的地址 否则返回NULL
void Delete (ElementType X, List L); // 删除X
Position FindPrevious (ElementType X, List L); // 查找X的前驱
void Insert(ElementType X,int i,List L); // 在第i个节点后插入 X
void DeleteList(List L); // 删除整个链表, 不包括头节点
Position Creat(void); // 创建空表
int main(void)
{
int i,t;
int a[10] = { 1,2,3,4,5,6,7,8,9,10};
Position L,T;
L = Creat();
for( i = 0; i < 10; i++)
{
Insert(a[i] ,i ,L);
}
// 以下几个是测试函数
// Delete(5,L);
// Delete(10,L);
// Delete(1,L);
// DeleteList( L);
// T = Find(5,L);
// printf("%d",T->Element);
// t = IsEmpty(L);
// printf("%d",t);
Print(L);
free(L);
return 0;
}
int IsEmpty(List L) // 测试一个表是否为空表
{
return L->Next == NULL;
}
int IsLast(Position P,List L) // 测试当前位置是否为链表的结尾
{
return P->Next == NULL;
}
Position Find(ElementType X, List L) // 在链表中查找X,返回X的地址 否则返回NULL
{
Position P;
P = L->Next;
while( P != NULL && P->Element != X)
{
P = P->Next;
}
return P;
}
void Delete (ElementType X, List L) // 删除X
{
Position P,TmpCell;
P = FindPrevious( X, L); // 找到X的前驱
if( !IsLast(P,L)) // 如果前驱为Last,表明链表中没有该元素
{
TmpCell = P->Next;
P->Next = TmpCell->Next;
free(TmpCell);
}
}
Position FindPrevious (ElementType X, List L) // 如果该元素为第一个返回头结点
{ //如果该元素不在链表中返回最后一个节点
Position P;
P = L;
while( P->Next != NULL && P->Next->Element != X)
{
P = P->Next;
}
return P;
}
void Insert(ElementType X,int i,List L) // 在第i个节点后面插入X
{
Position P,S;
int j = 0;
P = L;
while( P && j <= i -1 )
{
P = P->Next;
j++;
}
S =(Position) malloc(sizeof(Node));
if( !S)
printf("Insert error!");
else
{
S->Element = X;
S->Next = P->Next;
P->Next = S;
}
}
void DeleteList(List L) // 删除整个链表, 不包括头节点
{
Position P,Tmp;
P = L->Next;
L->Next = NULL;
while(P)
{
Tmp = P->Next;
free(P);
P = Tmp;
}
}
Position Creat(void) // 创建空表 ,返回空表的头指针
{
Position L;
L = (Position) malloc(sizeof(Node));L->Next = NULL;
return L;
}
void Print(List L) // 遍历整个链表
{
Position P;
P = L->Next;
while(P)
{
printf("%d",P->Element);
P = P->Next;
}
}