博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c简单的单向链表
阅读量:6948 次
发布时间:2019-06-27

本文共 3301 字,大约阅读时间需要 11 分钟。

ps:list链表  node节点

在链表中节点就是一个个的结构体

堆空间由于在申请内存时,地址是随机的,所以要用链表的方式将其连接起来,但是链表头的地址要知道.

每个节点包含两个部分:数据区和地址区,其中指向自身类型节点的指针叫做地址域,定义结构体时别忘了随便给head附上NULL地址.(尾地址不用单独定义,因为它是在节点内的)

由于最后一个节点之后没有指向的下一个节点,所以其地址域为NULL,如果是空链表,就是只定义了一个结构体,什么数据都没有,这个时候把表头的地址初始化定为NULL

节点的插入有头插法和尾插法:

头插法就是不断地在头部位置添加节点,如上图也就是新添加的节点的地址域要指向原来的头地址,新的头地址要改为新插入的节点的地址.这样刚好在添加第一个节点的时候,初始化的头地址变为了第一个节点的地址域也就是NULL,也就是尾指针变为了NULL.调用链表中的数据时,要定义一个节点类型的指针,它指向要和头地址的指向相同,然后利用它调用第一个节点,在将此节点的地址域赋给它,再次利用它调用下一个节点...只到它为NULL指针为止.

#include<stdio.h>

#include<stdlib.h>
struct Node
{
int data;
struct Node* pNext;
};
struct Node* pHead = NULL;
void AddHead(int data)
{
struct Node* p = (struct Node*)malloc(sizeof(struct Node));
p->data = data;
p->pNext = pHead;
pHead = p;
}
void Print()
{
struct Node* ptemp = pHead;
while (ptemp != NULL)
{
printf("%d ", ptemp->data);
ptemp = ptemp->pNext;
}
}
void main()
{
AddHead(1);
AddHead(2);
AddHead(3);
Print();
}

尾插法:尾插法相对来说比较麻烦,多了一个判断是不是第一个节点的过程

#include
#include
struct Node{ int data; struct Node* pNext;};struct Node* pHead = NULL;void AddHead(int data){ struct Node* p = (struct Node*)malloc(sizeof(struct Node)); p->data = data; p->pNext = pHead; pHead = p;}void AddTail(int data){ struct Node* p = (struct Node*)malloc(sizeof(struct Node)); p->data = data; if (pHead == NULL) pHead = p; else { struct Node* ptemp = pHead; while (ptemp->pNext != NULL) { ptemp = ptemp->pNext; } ptemp->pNext = p; } p->pNext = NULL;}void Print(){ struct Node* ptemp = pHead; while (ptemp != NULL) { printf("%d ", ptemp->data); ptemp = ptemp->pNext; }}void main(){ AddTail(1); AddTail(2); Print();}

链表中删除节点(数据结构中删除是最麻烦的)

按照上图的方法,中间和尾部的节点删除都可以成功,但是可以发现在删除头部第一个节点后打印会出错,是因为head前面没有节点了,头地址还没被改变,所以要在循环寻找数据之前,写一个if语句专门针对一下删除第一个节点的情况。还可以发现在整个链表为空的时候删除也会出错,所以也进行了特殊处理.所以在一个功能中要测试头,中间,尾和空四个特殊位置

#include<stdio.h>

#include<stdlib.h>
struct Node
{
int data;
struct Node* pNext;
};
struct Node* pHead = NULL;
void AddHead(int data)
{
struct Node* p = (struct Node*)malloc(sizeof(struct Node));
p->data = data;
p->pNext = pHead;
pHead = p;
}
void AddTail(int data)
{
struct Node* p = (struct Node*)malloc(sizeof(struct Node));
p->data = data;
if (pHead == NULL)
pHead = p;
else
{
struct Node* ptemp = pHead;
while (ptemp->pNext != NULL)
{
ptemp = ptemp->pNext;
}
ptemp->pNext = p;
}
p->pNext = NULL;
}
void Print()
{
struct Node* ptemp = pHead;
while (ptemp != NULL)
{
printf("%d ", ptemp->data);
ptemp = ptemp->pNext;
}
printf("\n");
}
void modify(int data, int newdata)
{
struct Node* ptemp = pHead;
if (ptemp == NULL)
{
puts("fail");
return;
}
while (ptemp->data != data&&ptemp != NULL)
{
ptemp = ptemp->pNext;
}
if (ptemp->data == data)
ptemp->data = newdata;
if (ptemp == NULL)
puts("fail");
}
int Delete(int data)
{
struct Node* ptemp = pHead;
struct Node* pfront = pHead;
if (ptemp == NULL)
{
puts("fail");
return 0;
}
if (ptemp->data == data)
{
pHead = ptemp->pNext;
free(ptemp);
ptemp = NULL;
return 1;
}
while (ptemp != NULL)
{
if (ptemp->data == data)
{
pfront->pNext = ptemp->pNext;
free(ptemp);
ptemp = NULL;
return 1;
}
pfront = ptemp;
ptemp = ptemp->pNext;
}
return 0;
}
void main()
{
modify(1,2);
Delete(1);
AddTail(1);
AddTail(2);
AddTail(4);
AddHead(3);
Print();
Delete(3);
Print();
modify(4, 5);
modify(1, 6);
Print();
}

  

 

转载于:https://www.cnblogs.com/ma77045728/p/6979699.html

你可能感兴趣的文章
[转]SQLITE3 C语言接口 API 函数简介
查看>>
Delphi XE5中使用jar包
查看>>
org.apache.felix.framework-5.6.12源码解析——org.apache.felix.framework文件夹最后的部分...
查看>>
Python3的tcp socket接收不定长数据包接收到的数据不全。
查看>>
b2b
查看>>
第三周Java学习总结
查看>>
OGRE的安装和编译【转+改】
查看>>
获取管理员组用户
查看>>
Mysql—(2)—
查看>>
简历的分布式
查看>>
[转]string和stringstream用法总结
查看>>
LeetCode:Rotate Array
查看>>
jquery pagination.js 分页
查看>>
DOM对象与jquery对象
查看>>
1.6(SQL学习笔记)存储过程
查看>>
XXS level8
查看>>
分布式日志收集系统:Facebook Scribe
查看>>
VxWorks下PCI驱动的配置与测试
查看>>
NSString 中包含中文字符时转换为NSURL
查看>>
Unity 协程停不了?
查看>>