单链表的实现

链表适合用于频繁插入删除的场景,经常存取的效率相对顺序结构较低

//当前链表包含头结点
//头结点...第一个结点...第N个结点...尾结点
#include <stdio.h>
#include <stdlib.h>
#define OK      1
#define ERROR   0
#define TRUE    1
#define FALSE   0

#define MAX_LENGTH 20

typedef int Status;
typedef int ElemType;

typedef struct Node {
    ElemType data;
    struct Node * next;
}LinkList;

//初始化链表
Status InitList(LinkList **L) {
    //需要传入头指针的地址,因为需要修改头指针本身
    *L = (LinkList*)malloc(sizeof(LinkList));
    if (!(*L)) {
        //分配存储空间失败
        return ERROR;
    }
    (*L)->next = NULL;
    return OK;
}

Status ListEmpty(LinkList L) {
    if (L.next) {
        return FALSE;
    }
    else {
        return TRUE;
    }
}

//清空链表
Status ClearList(LinkList* L) {
    LinkList* temp;
    LinkList* current = L->next;//指向链表的第一个结点

    while (current) {
        temp = current->next;
        free(current);
        current = temp;
    }
    L->next = NULL;
    return OK;
}

int ListLength(LinkList L) {
    int count = 0;
    LinkList *first = L.next;//指向链表的第一个结点
    while (first)
    {
        count++;
        first = first->next;
    }
    return count;
}

Status GetElem(LinkList L,int i,ElemType *e) {
    LinkList* first = L.next;//指向链表的第一个结点
    for (int j = 1; j < i; j++) {
        //定位到第i个元素
        first = first->next;
        if (!first) {
            return ERROR;//
        }
    }

    if (first) {
        *e = first->data;
        return OK;
    }
    else{
        return ERROR;//主要针对头结点为空的情况
    }    
}

int LocateElem(LinkList L,ElemType e) {
    int curPos = 0;
    LinkList* first = L.next;
    while (first) {
        curPos++;
        if (first->data == e) {
            return curPos;
        }
        first = first->next;
    }
    return 0;
}

Status ListInsert(LinkList* L, int i, ElemType e) {
    LinkList* curNode = L;
    //定位到第i-1个结点
    for (int j = 1; j < i; j++)
    {
        curNode = curNode->next;
        if (!curNode && j != i - 1) {
            //当在i-1个结点之前就没有后续结点,报错
            return ERROR;
        }
    }

    LinkList* newNode = (LinkList*)malloc(sizeof(LinkList));
    newNode->data = e;
    newNode->next = curNode->next;
    curNode->next = newNode;
    
    return OK;
}

Status ListDelete(LinkList *L, int i, ElemType *e) {
    LinkList* curNode = L;
    //定位到第i-1个结点
    for (int j = 1; j < i; j++)
    {
        curNode = curNode->next;
        if (!curNode && j != i - 1) {
            //当在i-1个结点之前就没有后续结点,报错
            return ERROR;
        }
    }
    if (!(curNode->next)) {
        //如果第i个元素不存在
        return ERROR;
    }

    LinkList *iNode = curNode->next;
    curNode->next = iNode->next;
    *e = iNode->data;
    free(iNode);
    return OK;
}

Status ListPrint(LinkList L) {
    LinkList* first = L.next;
    int i = 1;
    while (first)
    {
        printf("List %d:%d\n",i++,first->data);
        first = first->next;
    }
    return OK;
}
//测试代码
int main()
{
    LinkList* list = NULL;
    ElemType num;
    InitList(&list);
    for (int i = 1; i < 10; i++) {
        ListInsert(list,1,i);
    }
    ListPrint(*list);
    ListDelete(list, 3, &num);
    ListPrint(*list);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值