声明:参考书籍《算法笔记》 作者:作者: 胡凡 / 曾磊 出版社: 机械工业出版社 ISBN: 9787111540090
单向链表的实现
首先我们需要创建一个 struct 结构体,结构体里面创建两个变量,一个变量用于存放数据,另外一个用于存放地址(存放的是下一个节点的地址)。然后利用这个struct创建单向链表。
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
node* next;
};
node* create(int Array[], int n)
{
node *p, *head, *pre; //创建head用于存放首地址,p用于创建新的地址,pre用于存放下一个下一个节点的中间变量
head = new node;
head->next = NULL; //head的下一个地址暂时为NULL
pre = head; //将head赋值给 pre
for(int i=0; i<n; i++) //循环创建n个节点
{
p = new node; //p为新的节点
p->data = Array[i]; //创建p的同时给p赋值
p->next = NULL; //因为p的下一个节点还未创建,所以p->next =NULL
pre->next = p; //pre为上一个节点,将上一个节点的 ->next设置为p
pre = p; //将p赋值给pre用于创建下一个节点时赋值地址
}
return head; //返回头结点
}
//查找函数
int search(node* head, int x) //查找到 x 的数量
{
int count = 0; //用于存放x的数量
node *p = head->next; //p是指针,指向的是第二个节点地址,因为head只存放地址,所以head不可能是x
while(p != NULL) //只要没到最后一个节点就一直循环
{
if(p->data == x) count++;
p = p->next; //p指向下一个地址
}
return count;
}
//插入函数
void insert(node* head,int pos, int x) //在给定的位置插入数据
{
node *p = head; //p为节点
for(int i=0; i<pos-1; i++) p = p->next; //将p定位到pos的位置处
node* q = new node; //q为新的节点
q->data = x; //q得值为x 。q的下一个地址为p的下一个地址 。p的下一个地址为q
q->next = p->next;
p->next = q;
}
//删除函数
void del(node *head, int x) //删除所有的x
{
node *p = head->next; //p为下一个节点
node *pre = head; //pre保存上一个节点
while(p != NULL)
{
if(p->data == x) //达到寻找的条件
{
pre->next = p->next; //p上一个节点保存的地址变为p保存的地址
delete(p); //删除p
p = pre->next; //p变成pre的下一个节点
}
else //将p跟pre后移一位
{
pre = p;
p = p->next;
}
}
}