• 链表的操作


    #include <stdio.h>
    #include <stdlib.h>
    
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    
    typedef int ElemType;
    typedef int Status;
    
    /*
     * 存储结构
     */
    typedef struct LNode
    {
        ElemType data;
        struct LNode *next;
    }LNode, *LinkList;
    
    /*
     * 初始化线性表
     */
    void InitList(LinkList *L)
    {
        *L = (LinkList) malloc(sizeof(LNode));
        if (!L)
        {
            exit(OVERFLOW);
        }
        (*L)->next = NULL;
    }
    
    /*
     * 销毁线性表
     */
    void DestroyList(LinkList *L)
    {
        LinkList temp;
        while (*L)
        {
            temp = (*L)->next;
            free(*L);
            *L = temp;
        }
    }
    
    /*
     * 清空线性表
     */
    void ClearList(LinkList L)
    {
        LinkList p = L->next;
        L->next = NULL;
        DestroyList(&p);
    }
    
    /*
     * 判断是否为空
     */
    Status isEmpty(LinkList L)
    {
        if (L->next)
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }
    
    /*
     * 获取长度
     */
    int GetLength(LinkList L)
    {
        int i = 0;
        LinkList p = L->next;
        while (p)
        {
            i++;
            p = p->next;
        }
        return i;
    }
    
    /*
     * 根据位置获取元素
     */
    Status GetElem(LinkList L, int i, ElemType *e)
    {
        int j = 1;
        LinkList p = L->next;
        while (p && j < i)
        {
            j++;
            p = p->next;
        }
        if (!p || j > i)
        {
            return ERROR;
        }
        *e = p->data;
        return OK;
    }
    
    /*
     * 比较两个元素是否相等
     */
    Status compare(ElemType e1, ElemType e2)
    {
        if (e1 == e2)
        {
            return 0;
        }
        else if (e1 < e2)
        {
            return -1;
        }
        else
        {
            return 1;
        }
    }
    
    /*
     * 查找指定元素的位置
     */
    int FindElem(LinkList L, ElemType e, Status (*compare)(ElemType, ElemType))
    {
        int i = 0;
        LinkList p = L->next;
        while (p)
        {
            i++;
            if (!compare(p->data, e))
            {
                return i;
            }
            p = p->next;
        }
        return 0;
    }
    
    /*
     * 获取前驱元素
     */
    Status PreElem(LinkList L, ElemType cur_e, ElemType *pre_e)
    {
        LinkList q, p = L->next;
        while (p->next)
        {
            q = p->next;
            if (q->data == cur_e)
            {
                *pre_e = p->data;
                return OK;
            }
            p = q;
        }
        return ERROR;
    }
    
    /*
     * 获取后继元素
     */
    Status NextElem(LinkList L, ElemType cur_e, ElemType *next_e)
    {
        LinkList p = L->next;
        while (p->next)
        {
            if (p->data == cur_e)
            {
                *next_e = p->next->data;
                return OK;
            }
            p = p->next;
        }
        return ERROR;
    }
    
    /*
     * 插入元素
     */
    Status InsertElem(LinkList L, int i, ElemType e)
    {
        int j = 0;
        LinkList s, p = L;
        while (p && j < i - 1)
        {
            j++;
            p = p->next;
        }
        if (!p || j > i - 1)
        {
            return ERROR;
        }
        s = (LinkList) malloc(sizeof(LNode));
        s->data = e;
        s->next = p->next;
        p->next = s;
        return OK;
    }
    
    /*
     * 删除元素并返回值
     */
    Status DeleteElem(LinkList L, int i, ElemType *e)
    {
        int j = 0;
        LinkList q, p = L;
        while (p->next && j < i - 1)
        {
            j++;
            p = p->next;
        }
        if (!p->next || j > i - 1)
        {
            return ERROR;
        }
        q = p->next;
        p->next = q->next;
        *e = q->data;
        free(q);
        return OK;
    }
    
    /*
     * 访问元素
     */
    void visit(ElemType e)
    {
        printf("%d ", e);
    }
    
    /*
     * 遍历线性表
     */
    void TraverseList(LinkList L, void (*visit)(ElemType))
    {
        LinkList p = L->next;
        while (p)
        {
            visit(p->data);
            p = p->next;
        }
    }
    
    int main()
    {
        LinkList L;
        InitList(&L);
        ElemType e;
        int i;
        if (L)
        {
            printf("init success
    ");
        }
    
        if (isEmpty(L))
        {
            printf("list is empty
    ");    
        }
    
        for (i = 0; i < 10; i++)
        {
            InsertElem(L, i + 1, i);
        }
    
        if (GetElem(L, 1, &e)) {
            printf("The first element is %d
    ", e);
        }
    
        printf("length is %d
    ", GetLength(L));
    
        printf("The 5 at %d
    ", FindElem(L, 5, *compare));
    
        PreElem(L, 6, &e);
        printf("The 6's previous element is %d
    ", e);
    
        NextElem(L, 6, &e);
        printf("The 6's next element is %d
    ", e);
    
        DeleteElem(L, 1, &e);
        printf("delete first element is %d
    ", e);
    
        printf("list:");
        TraverseList(L,visit);
    
        DestroyList(&L);
        if (!L) {
            printf("
    destroy success
    ");    
        }
    }
  • 相关阅读:
    例行更新,防止被踢
    C语言 遍历磁盘目录
    析构函数的调用
    数组学习笔记
    函数学习笔记
    c++语言 纯虚函数的使用
    c++语言 内联方法
    复制构造函数
    c++语言 覆盖成员函数
    面向对象程序设计
  • 原文地址:https://www.cnblogs.com/kxzh/p/10919815.html
Copyright © 2020-2023  润新知