目录

链表删除指定值元素

反转链表(静态链表型)

 


链表删除指定值元素

错误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 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部