链表基本操作

  链表就是C中利用结构体,将数据和下一个结构体的地址封装在一个结构体中形成一个节点,这些节点组合起来就是一个基础的链表,根据需要可以扩展其中的内容来实现不同的需求。
  实现一个链表需要定义节点,创建,初始化,插入,删除这些基本操作。
  

#include "stdafx.h"
#include "stdlib.h"
#include "malloc.h"

#define OK 0
#define ERRO 1

typedef int DataType;
typedef int Status;

typedef struct LNode {
    DataType    data;
    struct LNode *next;
    }LNode,*LPoint;

//表尾插入
Status CreateLink(LPoint &L, int n, DataType *E) {
    int i;
    LPoint p, r;
    L = (LPoint)malloc(sizeof(LNode));
    if (!L) return ERRO;
    r = L;
    for (i = 0; i < n; i++)
    {
        if (!(p = (LPoint)malloc(sizeof(LNode))))
            return ERRO;
        p->data = E[i];
        r->next = p;
        r = p; //尾指针右移保持指向末尾
    }
    r->next = NULL; //无节点插入记得置为NULL指针
    return OK;
}

Status InsertLink(LPoint &L, int i, DataType e) {
    //在第i个位置前插入e 
    LPoint in, p = L;
    int counter = 0;
    //找第i-1个位置
    while (p->next != NULL && counter < i - 1) {
        p = p->next;
        counter++;
    }
    //这些变化需先判断再执行,方便下一个越界判断
    if (!p->next || counter>i-1)
        return ERRO; //超出范围
                     //p->next ==NULL 说明往后越界,counter >i-1 说明往前越界
    if (!(in = (LPoint)malloc(sizeof(LNode))))
        return ERRO;//内存不足
    in->data = e;
    in->next = p->next;
    p->next = in;
    return OK;
}

Status DelLink(LPoint L, int i, DataType e) {
    //删除第i个元素,由e返回它的值
    int counter = 0;
    LPoint del, p = L;
    while (p->next != NULL && counter < i - 1) {
        p = p->next;
        counter++;
    }
    if (!p->next || counter > i - 1)
        return ERRO;//越界
    del = p->next;
    p->next = del->next;
    e = del->data;
    free(del);
    return OK;
}

void PrintLink(LPoint L) {
    LPoint p = L->next;
    while (p) {
        printf("%d->", p->data);
        p = p->next;
    }
    printf("NULL\n");
}

int main()
{

    int S[] = { 1,2,42,31,21 };
    LPoint Link = NULL;
    CreateLink(Link, 5, S);
    PrintLink(Link);

    return 0;
}

这是一个带头结点的链表,基本操作都差不多。注意若是C来实现的话,头结点需要定义为二级指针,因为在函数里面改变了指针的指向,C++可以传引用,C就只能用二级指针来指了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值