单链表头文件 Link_list.h
#pragma once
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct Node
{
int Element;
struct Node* Next;
};
typedef struct Node* List;
typedef struct Node* Position;
int IsEmpty(List L); /* 判断链表L是否为空, 如果为空返回true */
int IsLast(Position P, List L); /* 判断P指针是否指向链表L的最后一个位置 */
Position Find(const int X, List L); /* 在链表L中查找值为X的元素,如果找到返回指向它的指针 */
void Delete(const int X, List L); /* 删除元素X, 只删除第一次出现的X, 如果不在链表中什么也不做 */
Position FindPrevious(const int X, List L); /* 获得元素X的前区指针, 如果X不在链表中,返回** */
void Insert(int X, List L, Position P); /* 位置P之后插入元素X */
void DeleteList(List L); /* 删除链表 */
Position Header(List L); /* 获得链表的头结点 */
Position First(List L); /* 获得链表的第一个元素的指针 */
单链表的实现 Link_list.c
#include "Link_list.h"
/* 判断链表L是否为空, 如果为空返回true */
int IsEmpty(List L)
{
return (NULL == L->Next);
}
/* 判断P指针是否指向链表L的最后一个位置 */
int IsLast(Position P, List L)
{
return (NULL == P->Next);
}
/* 在链表L中查找值为X的元素,如果找到返回指向它的指针 */
Position Find(const int X, List L)
{
if (IsEmpty(L))
return NULL;
Position p = L->Next;
while (NULL != p && p->Element != X)
p = p->Next;
return p;
}
/* 删除元素X, 只删除第一次出现的X, 如果不在链表中什么也不做 */
void Delete(const int X, List L)
{
Position now_X = Find(X, L);
Position prev_X = FindPrevious(X, L);
if (NULL != now_X && NULL != prev_X)
prev_X->Next = now_X->Next;
}
/* 获得元素X的前区指针, 如果X不在链表中,返回NULL */
Position FindPrevious(const int X, List L)
{
if (IsEmpty(L))
return NULL;
Position pX = Find(X, L);
Position prev_pX = NULL;
if (pX != NULL)
for (prev_pX = L->Next; prev_pX->Next != pX; prev_pX = prev_pX->Next)
;
return prev_pX;
}
/* 位置P之后插入元素X */
void Insert(int X, List L, Position P)
{
if (NULL == P)
return ;
List newElmt = (List)malloc(sizeof(List));
newElmt->Element = X;
if (IsLast(P, L)) {
newElmt->Next = P->Next;
P->Next = newElmt;
}
newElmt->Next = P->Next;
P->Next = newElmt;
}
/* 删除链表 */
void DeleteList(List L)
{
if (IsEmpty(L))
return ;
Position p = L->Next;
while (NULL != p){
Position p1 = p->Next;
free(p);
p = p1;
}
}
/* 获得链表的头结点 */
Position Header(List L)
{
return L;
}
/* 获得链表的第一个元素的指针 */
Position First(List L)
{
if (IsEmpty(L))
return NULL;
return L->Next;
}