链表及其基础操作
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 的使用
可以参考这篇博客