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;

}

}

相关推荐
R-G-B12 分钟前
【18】C实战篇——C语言 文件读写【fputc、fgetc、fputs、fgets】
c语言·c语言文件读写·fputc·fgetc·fputs·fgets
掘根14 分钟前
【Qt】绘图
开发语言·qt
咖啡续命又一天34 分钟前
python 自动化采集 ChromeDriver 安装
开发语言·python·自动化
huohaiyu1 小时前
synchronized (Java)
java·开发语言·安全·synchronized
_OP_CHEN1 小时前
C++基础:(九)string类的使用与模拟实现
开发语言·c++·stl·string·string类·c++容器·stl模拟实现
摸鱼的老谭1 小时前
Java学习之旅第二季-13:方法重写
java·学习·方法重写
蓝天智能1 小时前
QT MVC中View的特点及使用注意事项
开发语言·qt·mvc
木觞清2 小时前
喜马拉雅音频链接逆向实战
开发语言·前端·javascript
wuxuanok2 小时前
苍穹外卖 —— 公共字段填充
java·开发语言·spring boot·spring·mybatis
偷光2 小时前
浏览器中的隐藏IDE: Console (控制台) 面板
开发语言·前端·ide·php