链表
main.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "linklist.h"
int main(){
link_node *head = NULL;
// 初始化链表,输入-1结束
head = init_LinkList();
// 链表遍历
foreach_linklist(head);
// 在2的后面插入10
printf("insert 10 before 2\n");
insert_linklist(head, 2, 10);
foreach_linklist(head);
// 删除1
printf("delete 1\n");
delete_linklist(head, 1);
foreach_linklist(head);
// 链表销毁
destroy_linklist(head);
return EXIT_SUCCESS;
}
linklist.h
#pragma once
#define __CRT_SECURE_NO_WARNING
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct _LINKNODE
{
int data; //数据域
struct _LINKNODE* next; //指针域
}link_node;
// 初始化链表
link_node *init_LinkList();
// 遍历链表
void foreach_linklist(link_node *head);
// 插入节点
// 在指定值后面插入数据data 如果val不存在,则在尾部插入
void insert_linklist(link_node *head, int val, int data);
// 删除某个节点
void delete_linklist(link_node *head, int val);
// 销毁链表
void destroy_linklist(link_node *head);
linklist.c
#include "linklist.h"
link_node *init_LinkList()
{
// 创建头节点指针
link_node *head = NULL;
// 给头节点分配内存
head = (link_node *)malloc(sizeof(link_node));
if (head == NULL) {
perror("init_LinkList error");
return NULL;
}
head->data = -1;
head->next = NULL;
// 保存当前节点
link_node *p_curr = head;
int data = -1;
// printf("please enter data, -1 is end\n");
while (1)
{
scanf("%d", &data);
if (data == -1) {
break;
}
// 给新节点分配内存
link_node *newnode = (link_node*)malloc(sizeof(link_node));
newnode->data = data;
newnode->next = NULL;
// 新节点插入链表,也就是将节点插入到最后一个节点的下一位置
p_curr->next = newnode;
p_curr = newnode;
}
return head;
}
void foreach_linklist(link_node *head)
{
if (head == NULL) {
return;
}
// 赋值指针变量
link_node *p_curr = head->next;
while (p_curr != NULL)
{
printf("%d ", p_curr->data);
p_curr = p_curr->next;
}
printf("\n");
}
// 在指定值后面插入数据data 如果val不存在,则在尾部插入
void insert_linklist(link_node *head, int val, int data)
{
if (head == NULL) {
perror("head is null");
return;
}
link_node *p_curr = head->next, *newnode;
newnode = (link_node*)malloc(sizeof(link_node));
newnode->data = data;
while (p_curr->data != val && p_curr->next != NULL) {
p_curr = p_curr->next;
}
if (p_curr->next == NULL) {
printf("不存在值为%d的节点, 在尾节点插入\n", val);
}
newnode->next = p_curr->next;
p_curr->next = newnode;
}
// 删除某个节点
void delete_linklist(link_node *head, int val)
{
link_node *p_prev = head,*p_curr = head->next;
while (p_curr != NULL)
{
if (p_curr->data == val) {
break;
}
p_prev = p_curr;
p_curr = p_curr->next;
}
// 如果p_curr为空,说明没有找到
if (p_curr == NULL) {
printf("not found");
return;
}
p_prev->next = p_curr->next;
free(p_curr);
}
// 销毁链表
void destroy_linklist(link_node *head)
{
if (head == NULL){
return;
}
//赋值指针
link_node* p_current = head;
while (p_current != NULL){
//缓存当前节点下一个节点
link_node* p_next = p_current->next;
free(p_current);
p_current = p_next;
}
}