前言
重新把c语言的算法与数据结构学一遍,并且进行记录。
一、链表结构体以及初始化
typedef struct Node { //声明节点的类型和指向指针的指针类型
int data; //该节点的数据域
struct Node* next; //该节点的指针域
}Node;
//初始化链表
Node* initlink() {
Node* list = (Node*)malloc(sizeof(Node)); //给我们的list开辟一个大小为Node的内存空间
list -> data = 0; //对list的数据域进行赋值
list->next = NULL; //对list的下一个指向NULL
return list;
}
二、对链表的插入
1.头插法
代码如下(示例):
//头插法
void headInsert(Node* list, int data)
{
Node* node = (Node*)malloc(sizeof(Node)); //返回一个Node*的指针,大小为Node
node->data = data; //node接收进来的数据
node->next = list->next; //头插法:把node的下一个指向头部的下一个
list->next = node; //把头部的下一个指向node
list->data++; //把头部的data++,记录多少个节点
}
头插法插入一个数据:
头插法插入两个数据:
然后:
2.尾插法
代码如下(示例):
//尾插法
void cailInsert(Node* list, int data)
{
Node* head = list; //定义head指针,获取list的头部
Node* node = (Node*)malloc(sizeof(Node)); //返回一个Node*的指针,大小为Node
node->data = data; //node接收进来的数据
node->next = NULL; //尾插法:对node的下一个指向NULL,作为尾部
list = list->next; //list指向下一个
while (list->next) //当list的下一个指向NULL
{
list = list->next;
}
list->next = node; //把此时的list指向node
head->data++; //对头部的data域进行++
}
//尾插法第二种
void tailInsert(Node* list, int data)
{
Node* node = list; //定义node指向list
Node* n = (Node*)malloc(sizeof(Node*)); //定义n作为中间指针
for (int i = 0; i < list->data; i++) //
{
node = node->next; //找到最后一个节点
}
n->data = data; //赋值data
n->next = NULL; //n的下一个指向NULL
node->next = n; //把当前最后一个节点指向n
list->data++; //对list的data进行++,
}
这里有两种,其实都差不多的
3.删除链表中的某一个值
代码如下(示例):
//删除一个节点
void delete(Node* list,int data)
{
Node* head = list; //定义一个头部
Node* per = list; //作用:记录当前节点的前一个节点
Node* current = list->next; //作用:记录当前的节点
while (current) //循环知道current为NULL
{
if (current->data == data) //当找到data相等
{
per->next = current->next; //把当前的节点的前一个节点指向下一个节点
free(current); //对当前的节点进行释放
break;
}
per = current; //移动到下一个节点
current = current->next; //移动到下一个节点
}
list->data--; //当前的头部的数据进行减减
}
总结
不是很难。若上面有哪里写的不好,请指出,谢谢。