C语言学习--链式结构

结构体的应用:

//数据结构与算法

数据结构 ---- 指的是 数据的组织形式

数组 --- 数据结构

数组特点

连续性,有序性,单一性

数据操作(访问)时的特点


数组:

数据结构体---操作时候的特点, //特点决定他应用的场合

优势, s[i] 随机访问(随机存取)---> 存 拿数据很方便

不足: 插入数据 删除数据 不方便

链表

链式数据结构;

struct stu s1;

struct stu s2;

struct stu s3;

s1->s2->s3

特点:

优势:增加和删除数据 很方便

不足:存和取数据的时候不方便,没有数组方便

数据

指针

节点

struct Node

{

int data; //数据域 --存储要处理的数据

struct Node*next; //保存地址--指向下一个节点

}; //节点类型

struct Node n1;

struct Node n2;

struct Node n3;

链式存储的样子:

数据n1\] \[数据n2\] \[数据n3

指针\&n2\] \[指针\&n3\] \[指针 xxx

n1 n2 n3


有头链表和无头链表

无头--第一个节点数据与为随机值或者无效值

有头--第一个节点不存有效数据 //作用:为了更方便的操作链表

C语言中 ---> 主要研究 "有头单项链表"

头节点 ---数据域值随机

首节点 ---第一个保存有效数据的节点

尾节点 ---链表的最后一个有效节点 NULL。

操作: //数据结构体 数据的处理 --> 增删改查

1、创建一个链表

//空链表 -- 只有头节点 ,但没有有效的数据节点

struct Node *createEmptyLinklist(struct Node **head)

{

//struct Node *head = malloc(sizeof(struct Node));

*head = malloc(sizeof(struct Node));

(*head)->next = NULL;

return *head;

}

头加

void pushFront(struct Node *head,int dt)

{

struct Node *new = malloc(sizeof(struct Node ));

new->data = dt;

//s2

new->next = head->next;

//s3

head->next = new;

}

尾加

void pushBack(struct Node *head,int dt)

{

//s1

struct Node *new = malloc(sizeof(struct Node));

new->data = dt;

//s2

struct Node *p = head;

while (p->next!=NULL)

{

p = p->next;

}

//s3

p->next = new;

new->next = NULL;

}

头删

void popFront(struct Node *head)

{

struct Node *p = head->next;

head->next = p->next;

free(p);

}

尾删

void pushBack(struct Node *head,int dt)

{

//s1

struct Node *new = malloc(sizeof(struct Node));

new->data = dt;

//s2

struct Node *p = head;

while (p->next!=NULL)

{

p = p->next;

}

//s3

p->next = new;

new->next = NULL;

}

销毁链表:

void destroyLinklist(struct Node **head)

{

while (isEmpty(*head) == 0)

{

popFront(*head);

}

free(*head);

*head=NULL;

}

计算链表长度:

int length(struct Node *head)

{

struct Node *p = head->next;

int cnt = 0;

while (p != NULL)

{

cnt++;

p = p->next;

}

return cnt;

}

输出链表数据:

void printLinklist(struct Node *head)

{

struct Node *p = head->next; //

while ( p!= NULL)

{

printf("%d\n",p->data);

p = p->next;

}

}

相关推荐
passionSnail2 分钟前
《用MATLAB玩转游戏开发》Flappy Bird:小鸟飞行大战MATLAB趣味实现
开发语言·matlab
jz_ddk2 分钟前
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
c语言·开发语言·学习
stevenzqzq8 分钟前
kotlin flow防抖
开发语言·kotlin·flow
小鹿撞出了脑震荡9 分钟前
汇编学习——iOS开发对arm64汇编的初步了解
汇编·学习·ios
极小狐16 分钟前
如何从极狐GitLab 容器镜像库中删除容器镜像?
java·linux·开发语言·数据库·python·elasticsearch·gitlab
小鹿撞出了脑震荡28 分钟前
「OC」源码学习—— 消息发送、动态方法解析和消息转发
学习·ios·objective-c
wen__xvn34 分钟前
每日一题洛谷T534125 合数c++
开发语言·c++
茯苓gao43 分钟前
stm32 串口通讯 和 USART学习 二(HEX和文本数据包收发)
stm32·嵌入式硬件·学习
黄雪超1 小时前
JVM——Java语法糖与Java编译器
java·开发语言·jvm
cliff,1 小时前
数据提取之BeautifulSoup4快速使用
笔记·python·学习