算法的乐趣c/c++ —— 2.1链表的实现

声明:参考书籍《算法笔记》 作者:作者: 胡凡 / 曾磊  出版社: 机械工业出版社   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;
		}	
	}
}
	

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值