数据结构——链表及其基础操作(C语言实现)

BB Time

上个学期数据结构专业课又双叒叕水过去了
到学期末我才发现我竟然连链表都没有自己敲过
所以这个假期第一件事就是把数据结构认认真真学一遍

一、链表

二、链表基础功能

1、添加节点

void Add(LinkList* Head);

(1)原理

添加节点原理图
在 A 节点和 B 节点间添加 C 节点
只需要将 C 的指针域指向 B,再将 A 指向 C

(2)代码

void Add(LinkList* Head) {
    LinkList* Node = (LinkList*)malloc(sizeof(LinkList));
    printf("输入节点数据:");
    scanf("%d",&Node->Data);
    if (Head->Next!=NULL)
        Node->Next = Head->Next;
    else
        Node->Next = NULL;
    Head->Next = Node;
}

(3)注意

应该先将新节点的指针指向待插入位置的下一个节点再连接到前方的链表,否则会丢失后面的数据

2、删除节点

void Delet(LinkList* Head);

(1)原理

删除节点原理图
删除 A 节点和 C 节点间的 C 节点
将 A 指向 C

(2)代码

void Delet(LinkList* Head) {
    if (Head->Next==NULL) {
        printf("该链表为空\n");
        return;
    }
    int i,j=1;
    printf("输入待删除节点序号:");
    scanf("%d",&i);
    LinkList* NodeReader = (LinkList*)malloc(sizeof(LinkList));
    NodeReader = Head;
    while (NodeReader->Next!=NULL) {
        if (i==j) {
            NodeReader->Next = NodeReader->Next->Next;
            return;
        }
        j++;
        NodeReader = NodeReader->Next;
    }
    printf("无该节点");
}

3、修改节点数据

void Edit(LinkList* Head); 

(1)原理

输入需要修改的节点序号,遍历链表,找到对应节点,将其数据域修改为新值

(2)代码

void Edit(LinkList* Head) {
    if (Head->Next==NULL) {
        printf("该链表为空\n");
        return;
    }
    int i,j=0,x;
    printf("输入待修改节点序号:");
    scanf("%d",&i);
    printf("输入修改数据:");
    scanf("%d",&x);
    LinkList* NodeReader = (LinkList*)malloc(sizeof(LinkList));
    NodeReader = Head;
    while (NodeReader!=NULL) {
        if (j==i) {
            NodeReader->Data = x;
            return;
        }
        NodeReader = NodeReader->Next;
        j++;
    }
    printf("\n无该节点\n");
}

4、查找节点

void Serch(LinkList* Head);

(1)原理

输入需要查找的数据,遍历链表,找到对应数据,输出该节点的序号

(2)代码

void Serch(LinkList* Head) {
    if (Head->Next==NULL) {
        printf("该链表为空\n");
        return;
    }
    LinkList* NodeReader = (LinkList*)malloc(sizeof(LinkList));
    NodeReader = Head;
    int i=0,x;
    printf("输入待查找数据:");
    scanf("%d",&x);
    while (NodeReader!=NULL) {
        if (NodeReader->Data==x) {
            printf("第%d个节点的数据为%d",i,x);
            return;
        }
        NodeReader = NodeReader->Next;
        i++;
    }
}

5、创建链表

(1)原理

创建头节点,指针域指向NULL或第一个节点

(2)代码

LinkList* Creat() {
    LinkList *Head;
    Head = (LinkList*)malloc(sizeof(LinkList));
    Head->Next = NULL;
    return Head;
}

6、判空

(1)原理

如果头节点指向NULL,代表头节点后无节点,即链表为空

(2)代码

if (Head->Next==NULL) {
        printf("该链表为空\n");
        return;
 }

7、打印

(1)原理

遍历链表,输出每个节点的数据域

(2)代码

void Print(LinkList* Head) {
    LinkList* NodeReader = (LinkList*)malloc(sizeof(LinkList));
    if (Head->Next==NULL) {
        printf("该链表为空\n");
        return;
    }
    NodeReader = Head;
    printf("HEAD ");
    while (NodeReader->Next!=NULL) {
        NodeReader = NodeReader->Next;
        printf("---> %d ",NodeReader->Data);
    }
}

三、问题总结

1、malloc 函数

函数原型

void malloc(<#size_t __size#>)

malloc 函数返回为void型,所以需要使用强制类型转换将其转换为LinkList*

2、结构体调用中 . 和 -> 的区别

可以参考这篇博客

3、typedef 的使用

可以参考这篇博客

四、源代码

链表及其基础操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值