C++实现链表的增删改查

刚开始学数据结构,记录一下

本文内容都是由帅气的皮皮学长指导教学,基本上是原文复刻,大佬们轻喷。

#include<iostream>
using namespace std;
//带头结点单链表//
typedef struct NodeList{//属性集合(结点) 
	//数据
	int element;
	
	//指向下一个结点指针 
	struct NodeList* next; 
	
	
}node,*linklist;
//等同于: typedef struct NodeList* linklist; 
//linklist与node*等价,都是用来声明结构体指针变量的 
//linklist强调该指针标记标记了一个单链表
//node* 强调该指针标记了一个结点 

/操作:初始化,增删改查 

linklist initlist()
{//初始化带头结点的单链表 
	linklist l=(linklist)malloc(sizeof(node));//l指向头结点 
	if(l==NULL)//malloc 需要判断 内存分配是否成功
	{
		printf("内存分配不成功\n");//内存分配不成功 
	 } 
	 else{//分配成功 
	 	l->next=NULL;
	 } 
	return l; 
 } 
 
void head_insert(int k,linklist l)
{//头插法添加元素
	node* s=(node*)malloc(sizeof(node));
	s->element=k;//数据写入结点 
	 
	s->next=l->next;
	l->next=s;
	
	//尾插同学自己写 
}

//中间插入:先找到位置,再插入 
node* find(int k,linklist l)
{//查询k所在的结点 
//查询有两种,一种是找到这个结点。另一种是找到这个结点在链表中的哪个位置	
	node* p=l->next;//第一个元素 
	while(p!=NULL&&p->element !=k)
	{
		p=p->next;
	 } 
	 return p;//若没找到,则p=NULL,用查询结果的时候判断有没有找到 
}

void mid_insert(int k,linklist l,int x)
{//在数据为x的结点后插入数据域为k的新结点 
	node* s=(node*)malloc(sizeof(node));
	s->element=k;//数据写入结点 
	
	node* p=find(x,l);//找到P结点 
	
	s->next=p->next;//插入 
	p->next=s;
	
}
void i_insert(int k,linklist l,int i)
{//在第i个位置插入数据域为k的新结点 :先找到第i-1位置的结点
	 node* s=(node*)malloc(sizeof(node));
	s->element=k;//数据写入结点
	node *p=l;//找第i-1个结点
	int j=0;
	while(j<i-1)
	{
		p=p->next;
		j++;
	}
	s->next=p->next;
	p->next=s;
	//注意:不带头结点时的代码:分i=1时的特判和i!=1	
}
//尾插法
node* find2(linklist l)
{
	node* p = l->next;
	while (p->next!=NULL)
	{
		p = p->next;
	}
	return p;
}


void tail_insert(int k, linklist l)
{
	node* s = (node*)malloc(sizeof(node));
	s->element = k;
	node* p = find2(l);
	s->next = NULL;
	p->next = s;

}


void delete_node(int k,linklist l)
{//删除数据k所在的结点:先找到这个结点,再删除
//这个链表是否存在,还能否继续删除 
    if(l==NULL||l->next==NULL)
    {
    	printf("空链表\n");//返回是空链表 
    	//要先判断这个链表是不是空的,也就是还能不能删
		//认为用户是个傻子,什么离谱情况都要考虑到 
		return ;
	}
	node* p=find(k,l);
	if(p==NULL)
	{
		printf("未找到删除结点\n");//k不在链表中 
	 } 
	 else{//要删除第i个结点,要先找到第i-1个 
	 	node *q=l;
		while(q!=NULL)//找到第i-1个 
		{
			if(q->next==p)
			{
				
				break;
			}
			q=q->next;
		}   
		q->next =p->next;
		free(p); 
	 }
}
	 /*修改
	 与删除一样先找到p,
	 p->element=x; 
	 
	 */ 
 
 void printff(linklist l)
 {
 	node *p;
 	p=l->next;
 	
 	while(p!=NULL)
 	{
 		printf("%d ",p->element );
 		p=p->next;
	 }
	 printf("\n");
 }
 int main()
 {
 	linklist l=initlist();
 	head_insert(1,l);
 	head_insert(2,l);
 	head_insert(3,l);
 	head_insert(4,l);
 	printff(l);	
 	delete_node(2,l);
 	delete_node(4,l);
 	printff(l);
 	mid_insert(2,l,3);
 	mid_insert(5,l,2);
 	printff(l);
 	i_insert(6,l,1);
 	i_insert(7,l,3);
 	printff(l);
 	
  } 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++实现链表增删改查操作可以参考以下方法。 增加节点: 可以通过在链表尾部插入新节点的方式来增加节点。可以使用一个指针来指向链表的头节点,然后遍历链表直到找到最后一个节点,将新节点插入到最后一个节点的next指针处。 删除节点: 可以根据给定的位置来删除链表中的节点。可以使用一个指针来指向链表的头节点,然后根据位置遍历链表,找到要删除的节点的前一个节点,将前一个节点的next指针指向要删除节点的下一个节点。 修改节点值: 可以通过重载下标运算符来访问和修改链表中的节点值。可以使用一个指针来指向链表的头节点,然后根据给定的位置遍历链表,找到要修改的节点,然后修改节点的值。 查找节点: 可以通过遍历链表来查找特定值的节点。可以使用一个指针来指向链表的头节点,然后遍历链表,比较每个节点的值与目标值是否相等,如果相等则返回该节点。 以上是一种基本的实现方式,具体的实现代码可以参考引用\[1\]和引用\[2\]中给出的示例代码。这些示例代码提供了完整的链表实现,包括节点的插入、删除、修改和查找等操作。你可以根据自己的需求进行适当的修改和扩展。 #### 引用[.reference_title] - *1* *2* *3* [单向链表C++实现(增删改查)](https://blog.csdn.net/qq_41437512/article/details/127760996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值