【数据结构】数据结构C语言的实现(单链表)

单链表

/*
 * 单链表
 */
#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;
}

// 获取链表第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 > 1)
        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;
}

// 返回元素e的index
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 -1;
}

// 返回前一个元素(如果有的话)
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 q, p = L->next;
    while (p->next)
    {
        if (p->data == cur_e)
        {
            *next_e = p->next->data;
            return OK;
        }
        p = p->next;
    }
    return ERROR;
}

// 在index = i处插入元素e
Status InsertElem(LinkList L, int i, Elemtype e)
{
    int j = 0;
    LinkList s, p = L;
    // 让p指向第i-1个元素
    while (p && j < i - 1)
    {
        j++;
        p = p->next;
    }

    if (!p || j > i - 1)
        return ERROR;
    // 在第i个位置插入元素e
    s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

// 删除第i个元素,被删除的元素通过指针*e返回
Status DeleteElem(LinkList L, int i, Elemtype *e)
{
    int j = 0;
    LinkList q, p = L;
    // 让p指向第i-1个元素
    while (p->next && j < i - 1)
    {
        j++;
        p = p->next;
    }

    if (!p->next || j > i - 1)
        return ERROR;
    // 删除第i个元素
    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\n");

    if (isEmpty(L))
        printf("list is empty\n");
    for (i = 0; i < 10; i++)
        InsertElem(L, i + 1, i);
    if (GetElem(L, 1, &e))
        printf("The first element is %d\n", e);

    printf("length is %d\n", GetLength(L));
    printf("The 5 at %d\n", FindElem(L, 5, *compare));
    PreElem(L, 6, &e);
    printf("The 6's previous element is %d\n", e);
    NextElem(L, 6, &e);
    printf("The 6's next element is %d\n", e);
    DeleteElem(L, 1, &e);
    printf("delete first element is %d\n", e);
    printf("list:");
    TraverseList(L, visit);

    DestroyList(&L);
    if (!L)
        printf("\ndestroy success\n");
}
init success
list is empty
The first element is 0
length is 10
The 5 at 6
The 6's previous element is 5
The 6's next element is 7
delete first element is 0
list:1 2 3 4 5 6 7 8 9 
destroy success
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值