《数据结构与算法》-单链表基本操作的C语言实现

最近在学算法内容,发现很多算法依赖于基本的数据结构,所以从新温习数据结构,记录一下,以后知识点忘记可以提醒自己哪里比较容易出错。
所用教材《数据结构与算法分析》by Mark Allen Weiss
《数据结构》(C语言版) by严蔚敏

#include <stdio.h>
#include <stdlib.h>
#include "List.h"
//首先一些预定义:
struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
//定义一个结构体,表示一个结点
struct Node{
    ElementType Element;
    Position Next;//Position表示strut Node*;
};
/*
*测试一个链表是否为空的函数
*返回true为空,false非空
*/
int IsEmpty(List L)
{
    return L->Next==NULL;
}
/*
*测试当前位置是否为链表的末尾
*返回true表示是末尾,false表示不是末尾
*/
int IsLast(Position P,List L)
{
    return P->Next==NULL;
}
/*
*返回某个元素在表中的位置
*返回NULL表示没找到
*/
Position Find(ElementType X,List L)
{
    Position P;
    P=L->Next;
    while(P!=NULL&&P->Element!=X)
        P=P->Next;
    return P;
}
/*
*函数名 : CreateList()
*函数功能描述 : 创造一个n(不包括头结点)个结点的单链表
*函数参数 : List L单链表头结点  int n节点个数
*函数返回值 :void
*作者 : Tengyuan
*函数创建日期 : 2016.3.10
*备注:声明一个指向结构的指针并不创建该结构,只是预留了存储空间;而malloc函数会创建结构并返回指向该结构的指针。
*/
void CreateList(List L,int n)
{
    int i;
    for(i=0;i<n;++i)
    {
            List P=(List)malloc(sizeof(struct Node));
            P->Next=NULL;
            scanf("%d",&(P->Element));
            L->Next=P;//把结点P接到链表L后面
            L=P;//此时链表从P后面接入结点
    }
}
/*
*打印链表中的元素
*/
void ListPrint(List L)
{
    struct Node *P=L->Next;
    while(P!=NULL)
    {
        printf("%3d",P->Element);
        P=P->Next;
    }
}
/*
*返回元素X在L中前驱位置
*/
Position FindPrevious(ElementType X,List L)
{
    Position P;
    P=L;
    while(P->Next!=NULL && P->Next->Element!=X)
    {
        P=P->Next;
    }
    return P;
}
void Delete(ElementType X,List L)
{
    Position P,Ptr;
//    P=FindPrevious(X,L);//删除第一次出现的X值
//    if(!IsLast(P,L))
//    {
//        Ptr=P->Next;
//        P->Next=Ptr->Next;
//        free(Ptr);
//    }
    P=FindPrevious(X,L);//删除所有出现的X值
    while(!IsLast(P,L))
    {
        Ptr=P->Next;
        P->Next=Ptr->Next;
        free(Ptr);
        P=FindPrevious(X,L);
    }
}
//在表L中位置P后插入元素X
void Insert(ElementType X,List L,Position P)
{
    Position TmpCell;
    TmpCell=malloc(sizeof(struct Node));
    if(TmpCell==NULL)
        printf("Out of space!!!");
    TmpCell->Element=X;
    TmpCell->Next=P->Next;
    P->Next=TmpCell;
}

int main()
{
    List L;
    L=(List)malloc(sizeof(struct Node));//必须创造一个空间储存节点L,单独一个List L并没有创建头结点
    L->Next=NULL;

    CreateList(L,4);
    ListPrint(L);
    printf("\n");
    Delete(5,L);
    ListPrint(L);
    printf("\n");
    Insert(12,L,L->Next->Next);
    ListPrint(L);
    printf("\n");
    return 0;
}

你可能感兴趣的:(数据结构-C)