链表【4】

目录

链表删除指定值元素

反转链表(静态链表型)

 


链表删除指定值元素

错误1:两个if间没有用else,导致两个都执行了

#include<stdio.h>
const int N=1005;
int n,first,firstid;
using namespace std;
struct node
{
    int data;int next;
} ;
node lnode[N]; 

void readin()
{
	for(int i=0;i<n;i++)
	{	int idtemp;scanf("%d",&idtemp);
	scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
	}

}
//void deletex(int pre)
//{
//	lnode[pre].next=lnode[lnode[pre].next].next;
//}
int main()
{

    scanf("%d %d",&n,&firstid);int tgt;
//    int itern=first;
	scanf("%d",&tgt);
    readin();
	int pre,cur;cur=firstid;
    for(int i=0;i<N;i++)
    {if(cur==-1) break;
    if(i==0) if(lnode[cur].data==tgt) firstid=lnode[cur].next;
    if(lnode[cur].data==tgt ) 
    {lnode[pre].next=lnode[cur].next;
	}
    		pre=cur;cur=lnode[cur].next;

	}
    //	printf("——————");

	while(firstid!=-1 )
	{
		printf("%d %d %d\n",firstid,lnode[firstid].data,lnode[firstid].next);
		firstid= lnode[firstid].next;}
 
}

错误2:以循环次数i=0为判断头结点条件,删除了头结点之后 ,还想删头结点就判断不出来了

应该用cur==firstid

错误3:都要执行的部分放在某个括号里了

#include<stdio.h>
const int N=1005;
int n,first,firstid;
using namespace std;
struct node
{
    int data;int next;
} ;
node lnode[N]; 

void readin()
{
	for(int i=0;i<n;i++)
	{	int idtemp;scanf("%d",&idtemp);
	scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
	}

}
//void deletex(int pre)
//{
//	lnode[pre].next=lnode[lnode[pre].next].next;
//}
int main()
{

    scanf("%d %d",&n,&firstid);int tgt;
//    int itern=first;
	scanf("%d",&tgt);
    readin();
	int pre,cur;cur=firstid;
    for(int i=0;i<N;i++)
    {if(cur==-1) break;
    if(i==0) if(lnode[cur].data==tgt) 
	{	firstid=lnode[cur].next;

	}
	else{    if(lnode[cur].data==tgt ) 
    {lnode[pre].next=lnode[cur].next;
	}
    		pre=cur;cur=lnode[cur].next;
	} 


	}
    	//printf("——————");

	while(firstid!=-1 )
	{
		printf("%d %d %d\n",firstid,lnode[firstid].data,lnode[firstid].next);
		firstid= lnode[firstid].next;}
 
}

准确代码 

#include<stdio.h>
const int N=1005;
int n,first,firstid;
using namespace std;
struct node
{
    int data;int next;
} ;
node lnode[N]; 

void readin()
{
	for(int i=0;i<n;i++)
	{	int idtemp;scanf("%d",&idtemp);
	scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
	}

}
//void deletex(int pre)
//{
//	lnode[pre].next=lnode[lnode[pre].next].next;
//}
int main()
{

    scanf("%d %d",&n,&firstid);int tgt;
//    int itern=first;
	scanf("%d",&tgt);
    readin();
	int pre,cur;cur=firstid;
    for(int i=0;i<N;i++)
    {//printf("%d %d :\n",cur,firstid);
	if(cur==-1) break;
    if(cur==firstid) if(lnode[cur].data==tgt) 
	{	firstid=lnode[cur].next;

	}
	else{    if(lnode[cur].data==tgt ) 
    {lnode[pre].next=lnode[cur].next;
	}
	} 

    		pre=cur;cur=lnode[cur].next;

	}
    //	printf("——————");

	while(firstid!=-1 )
	{
		printf("%d %d %d\n",firstid,lnode[firstid].data,lnode[firstid].next);
		firstid= lnode[firstid].next;}
 
}

反转链表(静态链表型)

 

#include<stdio.h>
const int N=1005;
int n,first,firstid;
using namespace std;
struct node
{
    int data;int next;
} ;
node lnode[N]; 

void readin()
{
	for(int i=0;i<n;i++)
	{	int idtemp;scanf("%d",&idtemp);
	scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
	}

}
//void deletex(int pre)
//{
//	lnode[pre].next=lnode[lnode[pre].next].next;
//}
int main()
{

    scanf("%d %d",&n,&firstid);int tgt;
//    int itern=first;
//	scanf("%d",&tgt);
    readin();
	int pre=-1,cur,next;cur=firstid;
 while(cur!=-1)
 {next=lnode[cur].next;
 lnode[cur].next =pre;
 pre=cur;
 cur=next;
 
 }
 firstid=pre;
	while(firstid!=-1 )
	{
		printf("%d %d %d\n",firstid,lnode[firstid].data,lnode[firstid].next);
		firstid= lnode[firstid].next;}
 
}

进阶反转链表:dummy node就是这玩意。 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值