那个高手可以帮我解决一个关于C语言插入单链表的问题?我想改一下当插入位置不存在提示输入位置错误?

作者&投稿:鄘良 (若有异议请与网页底部的电邮联系)
跪求c语言高手 一道关于单链表尾插法的问题~

last = last -> prev;你这是尾插法吗?
感觉应该是头插法吧
你把new的节点放到last的最前面了吧
尾插法,应该有个循环,判断一下是否到尾部吧
加入代码
while(last->prev!=NULL)
last=last->prev;
这样last就是指向最后一个节点的指针了

再让new肤质给last-prev

还有一个问题,new是不是c的保留字啊,你就让他当变量来用

拜托,这也需要C语言的问题专家或高手进?
scanf函数的一般形式
scanf(格式控制,地址表列)
int scanf(char *format[,argument,...]);
“格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串首地址。
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
例题 scanf函数输入数据。
#include<stdio.h>
void main(){
int a,b,c;
printf("input a,b,c
");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
[编辑本段]格式字符 说明
%a 读入一个浮点值(仅C99有效)
%A 同上
%c 读入一个字符
%d 读入十进制整数
%i 读入十进制,八进制,十六进制整数
%o 读入八进制整数
%x 读入十六进制整数
%X 同上
%c 读入一个字符
%s 读入一个字符串,遇空格、制表符或换行符结束。
%f 用来输入实数,可以用小数形式或指数形式输入。
%F 同上
%e 同上
%E 同上
%g 同上
%G 同上
%p 读入一个指针
%u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数
%[] 扫描字符集合
%% 读%符号
附加格式说明字符表修饰符 说明L/l 长度修饰符 输入"长"数据
h 长度修饰符 输入"短"数据
W 整型常数 指定输入数据所占宽度
m指定输入数据所占的宽度
* 星号 空读一个数据
hh,ll同上h,l但仅对C99有效。
(B) 空白字符空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。(C) 非空白字符一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
注:scanf()控制串知识就介绍到这里(应该比较齐全了^_^),如有遗漏下次补上。下面将结合实际例程,一一阐述.三、 scanf()函数的控制串的使用例1.#include "stdio.h"
int main(void)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d
",a,b,c);return 0;
} 运行时按如下方式输入三个值:3□4□5 ↙(输入a,b,c的值)3,4,5 (printf输出的a,b,c的值) (1) &a、&b、&c中的&是地址运算符,分别获得这三个变量的内存地址。
(2) "%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。
以下是合法输入方式:
① 3□□4□□□□5↙
② 3↙
4□5↙
③ 3(tab键)4↙
5↙
例2.#include "stdio.h"
int main(void)
{
int a,b,c;scanf("%d,%d,%d",&a,&b,&c);
printf("%d,%d,%d
",a,b,c);return 0;
} 运行时按如下方式输入三个值:3,4,5 ↙(输入a,b,c的值)或者3,□4,□5 ↙(输入a,b,c的值)3,□□□4,□5 ↙(输入a,b,c的值)
......
都是合法的,但是","一定要跟在数字后面,如:
3□,4,□5 ↙就非法了,程序出错。(解决方法与原因后面讲)再如:1、sacnf()中的变量必须使用地址。 int a, b;
scanf("%d%d",a,b); //错误
scanf("%d%d",&a,&b);2、scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。例:
scanf("%d,%d",&a,&b);
输入: 3,4 ↙(逗号与"%d,%d"中的逗号对应)
scanf("a=%d,b=%d",&a,&b);
输入: a=3,b=4 ↙("a=","b=",逗号与"%d,%d"中的"a=","b="及逗号对应)
3、在用"%c"输入时,空格和“转义字符”均作为有效字符。例:
scanf("%c%c%c",&c1,&c2,&c3);
输入:a□b□c↙
结果:a→c1,□→c2,b→c3 (其余被丢弃)
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。问题二:scanf()函数不能正确接受有空格的字符串?如: I love you!
#include <stdio.h>
int main()
{
char str[80];
scanf("%s",str);
printf("%s",str); return 0;
}输入:I live you!
输出:I scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。所以,上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".这里要注意是"love you!"还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:#include <stdio.h>
int main()
{
char str[80];
char str1[80];
char str2[80];
scanf("%s",str);/*此处输入:I love you! */
printf("%s",str);
sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/
scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */
scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */
printf("
%s",str1);
printf("
%s",str2);
return 0;
}输入:I love you!
输出:I
love
you!好了,原因知道了,那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:#include "stdio.h"
int main()
{
char string[50];
/*scanf("%s",string);不能接收空格符*/
scanf("%[^
]",string);
printf("%s
",string);
return 0;
}问题三:键盘缓冲区残余信息问题
#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d c=%c
",a,c);
/*printf("c=%d
",c);*/
}while(c!='N');
} scanf("%c",&c);这句不能正常接收字符,什么原因呢?我们用printf("c=%d
",c);将C用int表示出来,启用printf("c=%d
",c);这一句,看看scanf()函数赋给C到底是什么,结果是 c=10 ,ASCII值为10是什么?换行即
.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(),一个“换行"(
),在这里被scanf()函数处理掉了(姑且这么认为吧^_^),而
被scanf()函数“错误”地赋给了c.解决办法:可以在两个scanf()函数之后加个fflush(stdin);,还有加getch(); getchar();也可以,但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。但是加fflush(stdin);不管什么情况都可行。函数名: fflush
功 能: 清除一个流
用 法: int fflush(FILE *stream);#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
fflush(stdin);
scanf("%c",&c);
fflush(stdin);
printf("a=%d c=%c
",a,c); }while(c!='N');
} 这里再给一个用“空格符”来处理缓冲区残余信息的示例:运行出错的程序:#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*这里%前没有空格*/
}
}使用了空格控制符后:#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意这里%前有个空格*/
}
} 可以运行看看两个程序有什么不同。问题四 如何处理scanf()函数误输入造成程序死锁或出错?#include <stdio.h>
int main()
{
int a,b,c; /*计算a+b*/scanf("%d,%d",&a,&b);
c=a+b;
printf("%d+%d=%d",a,b,c);
}如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输入,一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。正确的例程:#include <stdio.h>
int main()
{
int a,b,c; /*计算a+b*/while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);
c=a+b;
printf("%d+%d=%d",a,b,c);

给你一个可以解决很多单链表问题的程序,今天刚出炉的!!能找到你要解决的问题。
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int nDate;
struct node *pstnext;
}Node;
//链表输出
void output(Node *head)
{
Node *p = head->pstnext;
while(NULL != p)
{
printf("%d ", p->nDate);
p = p->pstnext;
}
printf("\r\n");
}
//链表建立
Node* creat()
{
Node *head = NULL, *p = NULL, *s = NULL;
int Date = 0, cycle = 1;
head = (Node*)malloc(sizeof(Node));
if(NULL == head)
{
printf("分配内存失败\r\n");
return NULL;
}
head->pstnext = NULL;

p = head;
while(cycle)
{
printf("请输入数据且当输入数据为0时结束输入\r\n");
scanf("%d", &Date);
if(0 != Date)
{
s = (Node*)malloc(sizeof(Node));
if(NULL == s)
{
printf("分配内存失败\r\n");
return NULL;
}
s->nDate = Date;
p->pstnext = s;
p = s;
}
else
{
cycle = 0;
}
}
p->pstnext = NULL;
return(head);
}
//单链表测长
void length(Node *head)
{
Node *p = head->pstnext;
int j=0;
while(NULL != p)
{
p = p->pstnext;
j++;
}
printf("%d\r\n", j);
}
//链表按值查找
void research_Date(Node *head, int date)
{
Node *p;
int n=1;
p = head->pstnext;
while(NULL != p && date != p->nDate)
{
p = p->pstnext;
++n;
}
if(NULL == p)
{
printf("链表中没有找到该值");
}else if(date == p->nDate)
{
printf("要查找的值%d在链表中第%d个位置\r\n", date, n);
}
return;
}
//按序号查找
void research_Number(Node *head, int Num)
{
Node *p=head;
int i = 0;
while(NULL != p && i < Num)
{
p = p->pstnext;
i++;
}
if(p == NULL)
{
printf("查找位置不合法\r\n");
}else if(i == 0)
{
printf("查找位置为头结点\r\n");
}else if(i == Num)
{
printf("第%d个位置数据为%d\r\n", i, p->nDate);
}
}
//在指定元素之前插入新结点
void insert_1(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre && j < i-1)
{
pre = pre->pstnext;
j++;
}
if(NULL == pre || j > i-1)
{
printf("插入位置不存在\r\n");
}else
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配内存失败\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}

}
//在指定元素之后插入新结点
void insert_2(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre->pstnext && j < i)
{
pre = pre->pstnext;
j++;
}
if(j == i)
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配内存失败\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}else
{
printf("插入位置不存在\r\n");
}
}
//删除第一个结点
void delete_list(Node *head)
{
Node *p = head->pstnext;
head->pstnext = p->pstnext;
free(p);
}
//删除指定结点
void Delete_1(Node *head, int i3)
{
Node *p = head, *pre = NULL;
int j = 0;
while(NULL != p && j < i3)
{
pre = p;
p = p->pstnext;
j++;
}
if(NULL == p)
{
printf("删除位置不存在\r\n");
}else
{
pre->pstnext = p->pstnext;
free(p);
}
}
//指定删除单链表中某个数据,并统计删除此数据的个数
int Delete_2(Node *head, int Delete_date)
{
int count = 0;
Node *p = head, *q;
while(NULL != p->pstnext)
{
q = p->pstnext;
if(q->nDate == Delete_date)
{
p->pstnext = q->pstnext;
free(q);
++count;
}
else
{
p = q;
}
}
return count;
}
//链表逆置
void Reverse_list(Node *head)
{
Node *q, *s;
if(NULL == head->pstnext || NULL == head->pstnext->pstnext)
{
return;
}
q = head->pstnext->pstnext;
head->pstnext->pstnext = NULL;
while(NULL != q)
{
s = q->pstnext;
q->pstnext = head->pstnext;
head->pstnext = q;
q = s;
}
}
//单链表的连接
void connect_list(Node *head, Node *head_New)
{
Node *p = head;
while(NULL != p->pstnext)
{
p = p->pstnext;
}
p->pstnext = head_New->pstnext;
}
void main()
{
int date, num; //待查找数据
int i3; //指定删除元素的位置
int i1, i2, Newdate_1, Newdate_2; //待插入的新数据
int Delete_date, k; //待删除的数据与其个数
Node *Head = NULL; //定义头结点
Node *Head_New = NULL;

//链表建立
Head = creat();
printf("输出建立的单链表\r\n");
output(Head);

//单链表测长
printf("单链表长度为\r\n");
length(Head);

//链表按值查找
printf("请输入待查找的数据\r\n");
scanf("%d", &date);
research_Date(Head, date);

//链表按序号查找
printf("请输入待查找序号\r\n");
scanf("%d", &num);
research_Number(Head, num);

//在指定第i1个元素之前插入新元素Newdate
printf("在指定第i个元素之前插入新元素Newdate");
printf("请输入i与元素且以逗号间隔\r\n");
scanf("%d,%d", &i1, &Newdate_1);
insert_1(Head, i1, Newdate_1);
printf("插入后新链表\r\n");
output(Head);

//在指定第i2个元素之后插入新元素Newdate
printf("在指定第i个元素之后插入新元素Newdate");
printf("请输入i与元素且以逗号间隔\r\n");
scanf("%d,%d", &i2, &Newdate_2);
insert_2(Head, i2, Newdate_2);
printf("插入后新链表\r\n");
output(Head);

//删除链表第一个结点
delete_list(Head);
printf("输出删除后的链表\r\n");
output_list(Head);

//指定删除i3元素
printf("删除元素的位置\r\n");
scanf("%d", &i3);
Delete_1(Head, i3);
printf("删除后新链表\r\n");
output(Head);

//指定删除单链表中某个数据,并统计删除此数据的个数
printf("请输入待删除的元素\r\n");
scanf("%d", &Delete_date);
k = Delete_2(Head, Delete_date);
printf("删除后新链表\r\n");
output(Head);
printf("删除指定元素在链表中的个数为:");
printf("%d\r\n", k);

//单链表逆置
Reverse_list(Head);
printf("逆置后输出\r\n");
output(Head);

//单链表的连接
printf("建立一个新链表\r\n");
Head_New = creat();
printf("输出新链表");
output(Head);
printf("将新链表连接到原来链表的尾部并输出\r\n");
connect_list(Head, Head_New);
output(Head);
return;
}


我有一个高中的数学问题,希望高手可以帮我解决一下、我需要解题步骤清晰...
过点P作平面ABC的垂线PO,点O在平面ABC上,连接CO,并延长交AB于点D ∵ΔABC是等边三角形、PA=PB=PC ∴O是ΔABC的内心 ∵AB=1,∴CD=√3\/2,CO=√3\/2*2\/3=√3\/3 又∵PC=2\/3 ∴COS∠PCO=(√3\/3)\/(2\/3)=√3\/2 ∴∠PCO=30° 即PC和平面ABC所成的角是30° 故选A ...

希望高手帮我解决一个几何题
解(2)和(3)组成的方程组,x会有正负两个值,因为要是与椭圆左端交点到O点连线与Y’轴的夹角,所以x取负值。4 根据A点坐标,计算角AOY-30度,就是答案。二、直线方程旋转变换法:这种方法比以一种简单点 1 将Y=5,在X'OY'中的形式找出来‘可以用旋转变换公式,也可以通过简单几何关系求...

有哪位高手帮我解决一下这道应用题:两个数的和是120,是这两个数的差的...
两个数的差是120\/4=30 (120+30)\/2=75 (120-30)\/2=45 两个数分别是75,45 补充:你可以这样理解。假设一个大数一个小数,它们的和是A,差是B。那么如果在A上再加上B,就等于把小数加上B(也就是大数)再加上大数,那就是两个大数,所以A+B的一半就是大数。也就是将小数补齐的思想。...

Computer Browser无法启动的问题。找个高手帮我!!
方法1:解决方法:在控制面板打开打开Windows 防火墙-例外-在\\"文件和打印机共享\\"打上对勾 点确定就OK了.方法2:1:控制面板-管理工具-“服务”中Computer Browser项的“常规”页面,设置启动类型为“自动”2:如依然被关闭,在其“恢复”页面,设置失败后“重新启动服务”,第一次失败,第二次失败,...

各位语文高手 , 帮我解决一个古文 、、谢谢
1、C 谏:劝阻 2、蒙大怒,击鼓会兵,欲就船攻宁:吕蒙勃然大怒,敲战鼓聚集部队,想要乘船攻击甘宁。3、吕蒙救护帮助投奔他的“厨下儿”,说明他的善良;听说甘宁不守诺言杀了那人,他要攻击甘宁,说明他的耿直重信义;盛怒之下却能听从母亲劝告,说明他的孝顺;放下私怨,从朝廷大局出发而与甘宁...

哪位高手帮一下我解决英语谜
1.a pear tree。pear与pair同音,成双成对,自然是comes in twos 2.Who always goes to bed with his shoes on?谁总是穿鞋睡觉? 答案:bat 蝙蝠睡觉时倒立的 3.What is always going but never gets anywhere?什么东西总是走却什么地方都到不了?答案:time ...

求QQ高手来帮我解决几个超级QQ的问题
第一个问题:短信+预付费版,一天2成长值,哪有2.5哦一楼你不要误人子弟好不好。取消手机续费的话短信取消挺麻烦的,直接打客服嘛,让他帮你把增值业务取消了,方便。开通超级扣扣的前提是要将扣扣号先绑定手机,没手机就更谈不上开通了。总之有那句话:有问题,找客服。打这电话又免费的,不打...

...好像是5短1短1长,每次开机都会这样,哪位高手能帮我解决
1短:内存刷新失败。解决方法,更换内存条 2短:内存ECC效验错误。解决方法:进入CMOS设置,将ECC效验关闭 3短:系统基本内存(第一个64KB)检查失败 4短:系统时钟出错 5短:CPU错误 6短:键盘控制器错误 7短:系统实模式错误,不能切换到保护模式 8短:显存错误 9短:ROM BIOS检验和错误 1长3短...

电脑经常蓝屏 高手给解决一下
详情请查看视频回答

我要成为一个电脑高手,哪位高手能帮我,我衷心感谢啊!
有这几个勤做保证外加要有非常大的毅力去克服各种困难。我相信你必然会成为电脑高手的,祝你好运!!!有计算机后每天下班后首先要开机练习。学习操作和软件。不过后来计算机出问题了,我就到处咨询同学和科技市场的朋友,如何解决。这样一个一个问题解决完后,很自然的我也成了高手,现在咨询我的人也...

新余市13219038133: 哪位大爷帮我解决几个简单C语言程序题?感谢万分!用C语言编写一个程序用来求一元二次方程(ax2+bx+c=0)的解.编写一个函数求一元二次方程的解,... -
牟荔氢溴:[答案] #include void main() {float solut(float a,float b,float c); float a, b,c; printf("input a,b,c"); scanf("%f ,%f, %f",&a,&b,&c); printf("x=%10.2f\n",solut(a,b,c)); } float solut(float a,float b,float c) { float x=1.5,x0,f,f1; do { x0=x; f=(a*x0+b)*x0+c; f1=2*a*x0+b; x=x0...

新余市13219038133: 希望各位C语言的高手帮我解决下面的这个题目,并解释一下题目中的for(i=0;i -
牟荔氢溴:[答案] B 不确定值 第一个双重for循环,对a00 a01 a02 a10 a11 a12 a20 a21 a22九个元素赋值 孙桓结束后j = 3 然后做累加的时候,是把a03 a13 . a73 的值累加,而这些元素并没有被赋值过 对于初始化值,不同编译器的做法不同,有赋值为0,有赋值为0...

新余市13219038133: 哪位大侠能帮我解决一个c语言编程问题?
牟荔氢溴: st只能是整数,你可以定义为int或者long.因为switch后面的表达式的值只能是整型

新余市13219038133: 求高手,帮忙解决一个C语言的题目
牟荔氢溴: #include <stdio.h> #include <stdlib.h>int ack(int p1, int p2) {if (p1 == 0)return p2 + 1; if (p2 == 0)return ack(p1 - 1, 1); return ack(p1 - 1, ack(p1, p2 - 1)); }int main(int argc, char** argv) {int p1, p2; if (argc < 3){printf("Usage: %s parameter...

新余市13219038133: 一个c语言的问题,请高手帮忙看看! -
牟荔氢溴: 调用substr就可以了. #include <iostream> #include <string> using namespace std; int main() { cout << "input cut m and n\n"; string str; //size_t m, n; string::size_type m, n; cin >> str; cin >> m >> n; if(m >= n) { cout << "m must >= n\n"; } if(n > ...

新余市13219038133: c语言啊,请高手解决啊! -
牟荔氢溴: #include #define FUNC(n) oper##nint oper1(int,int);int oper2(int,int);int oper3(int,int);int oper4(int,int);int main(){ int a,b,s; printf("输入两个参数...

新余市13219038133: 我有一个C语言问题,谁能帮帮我,我是刚刚学C语言,自己做了好久但是总是出错,求高手指教. -
牟荔氢溴: 你好,我也是C语言初学者,我来试试帮你解答.我要说的是“插入排序法”,我不会把答案全给你,我把方法全交给你,你自己...

新余市13219038133: 谁可以帮我解决一个C语言问题,谢谢!
牟荔氢溴: break; 改成continue

新余市13219038133: 求c语言高手帮忙解决一下? -
牟荔氢溴: switch(0)这样就会直行case 0语句了.你说屏幕一闪就没.你可以加上这句getchar();如果还不可以,你用dos窗口运行可执行文件,试试看 #include main(){ switch(0) { case...

新余市13219038133: 请高手帮忙解决一下C语言问题
牟荔氢溴: 全是5 x+++y 如果从右向左运算的话 可以看成 x+(++y) ++y目前值为2,下次再用就变为3了 所以是5 x=x+=x-1 先求x-1 是2 然后 x+=2 这是x值还是3, x=x+2 x = 5

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网