C语言数据结构第二章—— 用链表的实现的线性表
C语言数据结构第二章—— 用可变数组的实现的线性表 这些东西,重要的是节点的定义,他们的连接方式,剩下的就是实现了。
需要注意的点有
- 链表的循环
定义一个结构体指针,从head开始,一直next到最后的NULL,就是常用的链表循环
for ( p = pList->head;
p;
p =p->next){
printf("%d\t", p->value);
- 有输入情况的判定方法
if ( number != -1) //如果输入不结束,才进入循环
{}
- 定义节点
定义节点的地址,然后节点内有 值 和 下一个节点的地址,对于节点大家都用地址,但是要定义。
typedef struct node{
int value;
struct node *next;
//指向下一个同结构类型的指针
}Node;
- 定义head
Node *head = NULL;
- 怎么往链表内增加一个新元素
Node *p = (Node*)malloc(sizeof(Node));
//申请一块新的节点,p是plus的意思
p->value = https://www.it610.com/article/number;
p->next = NULL;
在这里插入代码片
- 怎么把之前最后的节点连上最新的节点
- 找到最后的节点(从第一个往后找)
Node *last = head;
//从第一个开始
if ( last ) {//如果有了第一个节点的话
while ( last->next ) { //last->next 如果是NULL,那就是最后一个节点
last = last->next;
//如果不是最后一个节点的话,那就让last等于一个节点
}//该函数出来之后就是最后节点了
// 下边还有else
6.2 最后节点和最新的连线
last->next = p;
}
else { //如果第一个节点都没被定义的话
head = p;
}
- 把这个功能从主函数抽出来做函数
多做一个结构来包含指向head的指针,这样的话就能把head结构的地址传入函数,从而能让函数改变结构体的值。
保留修改要传该值的指针进函数,*
void add(List *pList, int number);
add(&list, number);
typedef struct _list {
Node *head;
} List;
- 做更多的功能函数,
- 如打印链表的函数
循环依据是:p =p->next是否为真
- 链表的清除
- 如打印链表的函数
for ( p = pList->head;
p;
p = q){
q = p->next;
free(p);
}
C语言代码——实现部分操作
// 2020/2/13
//最简单的链表,最纯粹的享受
//是看浙大的翁凯的MOOC写的,从那入门#include
#include typedef struct _node {
int value;
struct _node *next;
//指向下一个同结构类型的指针
} Node;
typedef struct _list {
Node *head;
} List;
void add(List *pList, int number);
void print(List *pList);
void find(List *pList);
void Delete(List *pList);
int main()
{
List list;
list.head = NULL;
int number;
//每做完一种操作print出来检查一下,程序员的好习惯(逃)
do {
scanf("%d", &number);
if( number != -1){
add(&list, number);
}
} while ( number != -1 );
print(&list);
find(&list);
Delete(&list);
print(&list);
return 0;
}void add(List *pList, int number)
{
// add to linked-list
Node *p = (Node*)malloc(sizeof(Node));
p->value = https://www.it610.com/article/number;
p->next = NULL;
// find the last
Node *last = pList->head;
if ( last ) {
while ( last->next ) {
last = last->next;
}
//attach
last->next = p;
} else {
pList->head = p;
}
}void print(List *pList){
Node *p;
for ( p = pList->head;
p;
p =p->next){
printf("%d\t", p->value);
}
}void find(List *pList){
Node *p;
int isFound = 0, number = 0;
scanf("%d", &number);
for ( p = pList->head;
p;
p=p->next ){
if ( p->value =https://www.it610.com/article/= number){
printf("找到了\n");
isFound = 1;
break;
}
}
if ( !isFound) {
printf("没找到\n");
}
}void Delete(List *pList)
{
int Dnumber=0, isFound = 0;
scanf("%d", &Dnumber);
Node *it, *beforeit = NULL;
for ( it = pList->head;
it;
it = it->next ){
if( Dnumber == it->value) {
if(!beforeit) {
pList->head = it->next;
isFound = 1;
}
else{
beforeit->next = it->next;
isFound = 1;
}
}
beforeit = it;
}
if(isFound == 0) { printf("链表没这个值可以删\n");
}
else{ printf("已删除%d\n", Dnumber);
}
}
后记
【C语言数据结构第二章—— 用链表的实现的线性表】这个编辑器有点用不惯,不过比那个富文本编辑器好用点…
不想写串和数组的结构啊啊啊啊…不过还是得写吧,都实现一遍才能说学过了,估计得过两天才能写到树了…
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- C语言解方程的根和判断是否是闰年
- C语言的版本比较
- 【C】题目|【C语言】题集 of ⑥
- echart|echart 双轴图开发