在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;
}