节点如下
struct listnode{
int data;
struct listnode *next;
};
head为头节点 如下
//结构体指针重定义
typedef struct listnode* node;
void initnode(node head) {
head->next = NULL;
}
链表插入(需要用malloc开辟空间)
原本 节点1的next 指向节点2。 所以节点1的head->next 就指向节点2
节点1的 next指向 插入节点 。 插入节点的next指向节点2。
插入后可知
插入节点->next = 节点1的head->next;
节点1的head->next = 插入节点;
//插入的位置,数据,头节点
bool list_insert(int index, int insert_data, node head){
node new_node = malloc(sizeof(struct listnode));
if(new_node==NULL)
return 0;
// while这里可以加个判断是否 为节点末尾了 跟完善
while(index--){
head = head->next;
}
new_node->data = insert_data;
new_node->next = head->next;
head->next = new_node;
return 1;
}
链表删除(不需要开辟)
遍历找到删除位置
把删除节点的前节点指向后一个节点
原本 前节点的next指向 删除节点,然后删除节点的next指向 后一个节点
图中删去节点2 之后节点1的next 必须指向节点3,所以节点3为节点1->next->next
即节点1->next = head->next->next;(节点1->next->next)也就是节点3
bool list_delete(int index, node head){
if(index < 1)
return 0;
int pre_index = 0;
// per_index 代表前节点因为比index小1
while(pre_index < index -1 && head!=NULL)
{
head = head->next;
pre_index++;
}
node tep = head->next;
head->next = head->next->next;
free(tep);
return 1;
}
链表查询(元素在第几个链表)
while判断就行
int find_data(node head,int data){
int index;
do
{
head = head->next;
index++;
} while (head->data!=data);
return index;
查询链表数量
加个变量 遍历链表判断是否到末尾 期间变量++
int list_all(node head){
int all = 0;
do
{
head = head->next;
all++;
} while (head->next!=NULL);
return all;
}
打印链表数据
循环判断链表是否到尾,期间遍历链表输出 链表数据
void printf_list(node head){
while (head->next)
{
head = head->next;
printf("%d", head->data);
}
}