单链表头文件 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; }