简单链表的建立以及一些基本操作

#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)   // 创建空表 ,返回空表的头指针 
{

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;
}
}

猜你喜欢

转载自blog.csdn.net/canhelove/article/details/80457704