在vs2015社区版写了一段代码,编译通过,运行出错,没查出原因,跟IDE有关吗?

梧桐栖鸦
博客专家认证
2015-12-03 11:07:37
/*此程序在vs2015编译通过,但运行出错,没能查出原因,求教高手*/
/*用以前写的一个程序在vs2015上实验了一下,也是运行出错,以前在vs2010正常运行(不是scanf_s这样的问题)*/

#include <stdio.h>
#include <stdlib.h>
#define NULL 0

/*定义一个listNode链表结构存放数据*/
struct listNode
{
char data;
struct listNode *nextPtr;
};

typedef struct listNode listNode; /*listNode代表struct listNode结构体*/
typedef struct listNode *listNodePtr; /*listNodePtr代表struct listNode *类型指针*/

/*说明*/
void instruction(void)
{
printf("Instruction:\n"
" 1.Creat a list\n"
" 2.Insert a character\n"
" 3.Delete a character\n"
" 4.Search a character\n"
" 5.END\n"
"Please Enter Your Choice:");
}

/*输入选项的判断*/
void choiceCheck(int choice)
{
while (!(choice >= 1 && choice <= 5))
{
printf("您的选择有误,请输入选项前对应的数字!\n");

instruction();
scanf_s("%d", &choice); /*输入选项前对应的数字*/
}
}

/*创建链表*/
listNodePtr creat(listNodePtr startPtr)
{
listNodePtr currentPtr; /*当前指针*/
listNodePtr previousPtr; /*上一个指针变量*/

currentPtr = startPtr;
previousPtr = startPtr; /*将currentPtr和previousPtr指针同时置于startPtr位置*/

if (startPtr==NULL)
{
printf("Please Enter data.Afer enter data press ENTER!\n");
printf("Enter 0 for End Enter!\n");
scanf_s("%c", &previousPtr->data);
previousPtr->nextPtr = currentPtr;
while (previousPtr->data!=NULL)
{
scanf_s("%c", &(currentPtr->data));
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}
currentPtr->nextPtr = NULL;
}
else
{
/*若链表不为空将指针移到链表的尾部*/
while (currentPtr->nextPtr!=NULL)
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}

printf("Please Enter data.Afer enter data press ENTER!\n");
printf("Enter 0 for End Enter!\n");

while (previousPtr->data!=NULL)
{

scanf_s("%c", &(currentPtr->data));
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}
currentPtr->nextPtr = NULL;
}
return startPtr;
}

/*插入函数*/
listNodePtr insert(listNodePtr startPtr,listNodePtr newPtr)
{
listNodePtr previousPtr;
listNodePtr currentPtr;

previousPtr = startPtr;
currentPtr = startPtr;

if (startPtr==NULL)
{
startPtr = newPtr;
startPtr->nextPtr = NULL;
}
else
{
/*将数据按照由小到大的顺序插入到链表中*/
while (newPtr->data > previousPtr->data && currentPtr!=NULL)
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}

/*若查找到链表尾,将数据添加到链表尾部*/
if (currentPtr==NULL)
{
currentPtr = newPtr;
newPtr->nextPtr = NULL;
}
else
{
previousPtr->nextPtr = newPtr;
newPtr->nextPtr = currentPtr;

}
}
printf("%c", startPtr->data);
return startPtr;
}

/*删除链表节点函数*/
listNodePtr delet(listNodePtr startPtr, char delCharator)
{
listNodePtr previousPtr;
listNodePtr currentPtr;

previousPtr = startPtr;
currentPtr = startPtr;

if (startPtr==NULL)
{
printf("This is an empty list!\n");
}
else
{
/*删除的数据在表头*/
if (delCharator==startPtr->data)
{
startPtr = startPtr->nextPtr;
free(currentPtr);
}
else
{
/*删除的数据不再表头*/
while (delCharator!=currentPtr->data && currentPtr!=NULL)
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}


if (currentPtr==NULL) /*节点搜索到链表尾*/
{
printf("The list have no this charator!\n");
}
else
{
/*在某个节点找到要删除的数据*/
previousPtr->nextPtr = currentPtr->nextPtr;
free(currentPtr);
}
}
}

return startPtr;
}

/*查询函数*/
void search(listNodePtr startPtr, char searchCharactor)
{
listNodePtr currentPtr;

currentPtr = startPtr;

if (startPtr != NULL)
{
printf("The list is empty!\n");
}
else
{
while (searchCharactor!=currentPtr->data && currentPtr!=NULL)
{
currentPtr = currentPtr->nextPtr;
}
if (currentPtr == NULL)
{
printf("The charactor not found!\n");
}
else
{
printf("Search successful!\n");
}
}
}

/*打印函数*/
void print(listNodePtr startPtr)
{
while (startPtr!=NULL)
{
printf("%c", startPtr->data);
}
}

int main(void)
{
listNodePtr startPtr;
char item; /*删除和查找的数据*/
int choice; /*输入选项函数*/

startPtr = (listNodePtr)malloc(sizeof(listNode));
startPtr->nextPtr = NULL;

instruction();
scanf_s("%d", &choice); /*输入选项前对应的数字*/

/*输入选项校验*/
choiceCheck(choice);

while (choice != 5)
{
switch (choice)
{
case 1:
startPtr = creat(startPtr);
break;
case 2:
listNodePtr newPtr;
newPtr =(listNodePtr)malloc(sizeof(struct listNode));

newPtr->nextPtr = NULL;
if (newPtr == NULL)
{
printf("内存没有分配成功!\n");
}
else
{
printf("Enter insert item\n");
scanf_s("%c", &item);

newPtr->data = item;
startPtr = insert(startPtr, newPtr);
}
break;
case 3:
printf("Enter delet item\n");
scanf_s("%c", &item);

delet(startPtr, item);
break;
case 4:
printf("Enter search item\n");
scanf_s("%c", &item);

search(startPtr, item);
break;
default:
break;
}
}

return 0;
}
...全文
210 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2015-12-05
  • 打赏
  • 举报
回复
引用 6 楼 keith_bb 的回复:
引用 2 楼 paschen 的回复:
出错时断下看出错在哪分析原因
错误就是这两张截图,特别是插入那个输出连续输出两个,而且第二个还是乱码,不应该啊
点重试,再点中断,通过调用规格与变量监视等窗口观察分析原因,从提示上说应该是buffer = NULL了,但你断言他不应该等于NULL
relaxisland 2015-12-04
  • 打赏
  • 举报
回复
怎么出错法?
tiamocying 2015-12-04
  • 打赏
  • 举报
回复
编译通过并不能证明程序就没有问题,比如一些逻辑性的错误,如除数为0,这样编译器是检查不出来 的,但是你运行的时候 就会出错
梧桐栖鸦 2015-12-04
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
出错时断下看出错在哪分析原因
错误就是这两张截图,特别是插入那个输出连续输出两个,而且第二个还是乱码,不应该啊
梧桐栖鸦 2015-12-04
  • 打赏
  • 举报
回复
引用 3 楼 tiamocying 的回复:
编译通过并不能证明程序就没有问题,比如一些逻辑性的错误,如除数为0,这样编译器是检查不出来 的,但是你运行的时候 就会出错
对,我就是检查不出来,郁闷
梧桐栖鸦 2015-12-04
  • 打赏
  • 举报
回复
引用 1 楼 relaxisland 的回复:
怎么出错法?
paschen 2015-12-04
  • 打赏
  • 举报
回复
出错时断下看出错在哪分析原因

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧