链表
一、创建链表
- 首先定义一个结构体
node
存储数据和指向下一个链表的指针next
- 定义清空的函数,先定义一个指针,让它指向
head
- 通过
current_node
不断指向后一个节点来遍历整个链表 - 定义
deleted
来保存当前的节点,之后让current_node
指向后一个节点 - 最后释放
deleted_node
指向的内存空间
typedef struct Node{
int data;
struct Node *next;
}Node, *LinkedList;
void clear(LinkedList head) {
Node *current_node = head;
while (current_node != NULL) {
Node *delete_node = current_node;
current_node = current_node->next;
free(delete_node);
}
}
二、链表的插入
- 如果链表原为空,传入的指针即为链表的头元素,
head
即为node
- 如果链表要插入的元素为首地址
- 接下来,定义
current_node
储存头元素,遍历到所要插入的位置 - 将要插入的元素插入,返回头元素
LinkedList insert(LinkedList head, Node *node, int index) {
if (head == NULL) {
if (index != 0) {
return head;
}
head = node;
return head;
}
if (index == 0) {
node->next = head;
head = node;
return head;
}
Node *current_node = head;
int count = 0;
while (current_node->next != NULL && count < index - 1) {
current_node = current_node->next;
count++;
}
if (count == index - 1) {
node->next = current_node->next;
current_node->next = node;
}
return head;
}
三、遍历链表
- 定义一个
current_node
指针,用while
循环遍历链表
void output(LinkedList head){
if(head == NULL){
return;
}
Node *current_node = head;
while(current_node != NULL){
printf("%d ",current_node->data);
current_node = current_node->next;
}
printf("\n");
}
四、链表删除
- 遍历链表,定义一个返回值为Linkedlist类型的函数deleted_node,找到要删除的
index
,
LinkedList deleted_node(LinkedList head,int index){
if(head == NULL){
return head;
}
Node *current_node = head;
int count = 0;
if(index == 0){
head = head->next;
free(current_node);
return head;
}
while(current_node->next!=NULL && count<index-1){
current_node = current_node->next;
count++;
}
if(count == index-1 && current_node->next!=NULL){
Node *deleted_node = current_node->next;
current_node->next = deleted_node->next;
free(deleted_node);
}
return head;
}
五、链表反转
- 定义
current_node
,next_node
指向头结点和下一节点 next_node
指向头结点下一节点,head
断开下一节点- 遍历整个链表,用
current_node
记录next_node
的下一节点,next_node
指向head
head
= next_node
next_node
= current_node
,继续向后遍历
LinkedList reverse(LinkedList head){
if(head==NULL){
return head;
}
Node *current_node,*next_node;
next_node = head->next;
head->next = NULL;
while(next_node != NULL){
current_node = next_node->next;
next_node->next = head;
head = next_node;
next_node = current_node;
}
return head;
}