解题思路:
这里提供都插法。
所谓头插法就是我们建立一个空的节点来充当头部。这样建立的好处有利于本题的插入与删除。具体思路看我代码的注释
注意事项:
我们要注意的是但插入与删除节点是否在我们链表的范围。
参考代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int num;
//这里pnext,pfront分别代表该节点指向后一个节点和前一个节点
struct stu *pnext,*pfrond;
}stu;
int creat(int n,int a,int k,stu *phead,int length)
{
stu *pnew=NULL,*pend=NULL,*pm;
//同样的在这里我们分n的三种情况
if(n==0){
//当n=0时,我们只需要遍历输出就好了
pnew=phead->pnext;
while(pnew!=phead){
printf("%d ",pnew->num);
pnew=pnew->pnext;
}
printf("\n");
//因为我们输出length没变所以返回length就好了
return length;
}else if(n==1){
if(a>length+1)return length;
//当我们插入一个节点时,是不是插入的位置最大只能在最大长度的后一个位置
pnew=phead;
int m=1,j;
while(1){
//这里我们遍历到插入节点的位置
//这里我们同样分为两种情况,第一种就是当第一次插入节点时和第二次插入
if(m==a){
pm=(stu*)malloc(sizeof(stu));
pm->num=k;
if(pnew->pnext==NULL){
pm->pfrond=pnew; //第一次
pnew->pfrond=pm;
pnew->pnext=pm;
pm->pnext=pnew;
}else{
pm->pfrond=pnew;
pm->pnext=pnew->pnext; //第二次及第二次以上
pend=pnew->pnext;
pend->pfrond=pm;
pnew->pnext=pm;
}
return length+1; //我们没成功插入一个节点length的长度加一
}
pnew=pnew->pnext;
m++;
}
}else if(n==2){
//这里删除节点同样分为两种情况
//第一种,就是删除的节点在我们链表的范围之内
//第二种,就是不在我们链表的范围,此时就不需要删除节点了
if(n>length)return length; //没成功删除长度不变
int i;
pnew=phead;
for(i=1;i<=a;i++){
pnew=pnew->pnext;
}
pm=pnew->pfrond;
pend=pnew->pnext;
pm->pnext=pend;
pend->pfrond=pm;
free(pnew);
return length-1; //成功删除长度减一
}
}
int main()
{
int n,a,k,length=0;
a=0,k=0;
stu *phead;
//定义一个头部的地址
phead=(stu*)malloc(sizeof(stu));
phead->pfrond=phead->pnext=NULL;
//这里输入n,依题目可分为三种情况。1、n=0, 2、n=1, 3.n=2
while(scanf("%d",&n)!=EOF){
if(n==1){
scanf("%d%d",&a,&k);
}else if(n==2){
scanf("%d",&a);
}
length=creat(n,a,k,phead,length);
//这里函数creat的参数大致是这样设定的
//当n=1时,我们这后面的a,k就代表了题目中的情况
//当n=0时,我们虽然传了值进去,但在这里根据题目要求我们不使用它
//当n=2是,我们k就没有用处就和n=0是a,k不使用类似
//phead代表头部地址,length代表我们现在链表的单位长度,这里头部不计长度
}
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复