运行错误!

#include<stdio.h>
#include<conio.h>
#include<malloc.h>

typedef struct POINT
{
	int row;
	int col;
	struct POINT *next;
}POINT;

void initPointLink(POINT **pointLinkHeadPointer);
void showPoints(POINT *pointLinkHead);
void showOnePoint(POINT onePoint);
void destroyPointLink(POINT **pointLinkHeadPointer);
void insertPointToLink(POINT **pointLinkHeadPointer);
POINT *searchPreToPoint(POINT *h, POINT old);
void changePointValue(POINT *point, int row, int col);
POINT *makeOnePoint(int row, int col);

POINT *makeOnePoint(int row, int col)
{
	POINT *p;

	p = (POINT *)malloc(sizeof(POINT));//申请新的节点
	p->row = row;
	p->col = col;         
	p->next = NULL;

	return p;
}

void changePointValue(POINT *point, int row, int col)
{
	point->row = row;
	point->col = col;
}

POINT *searchPreToPoint(POINT *h, POINT old)
{
	POINT *q = NULL;

	for(; h&&(h->row != old.row||h->col != old.col); h = h->next)
		q = h;

	return q;

	//查找将会有以下几种情况:
	//1、没有找到,也就是遍历完真个链表,压根就不存在要找的点,那么他将会返回最后一个点的链域,即q->next=NULL
	//2、找到的点就是第一个节点,那么将会返回一个q==NULL的值;
	//3、要找的点就是找到了,切返回值应该及时我们要找的节点的前驱结点
	//根据以上分析,该函数是有返回值的,返回值的类型
}

void insertPointToLink(POINT **hp)
{
	POINT *pre;	 	 //指向要插入位置点的前驱结点
	POINT *p;		 //指向新点
	POINT oldPoint;  //要插入位置的点,

	int newRow;
	int newCol;
	int oldRow;
	int oldCol;

//	printf("\n当前点信息如下:\n");
	showPoints(*hp);
	printf("\n");
	printf("请输入新点坐标:\n");
	scanf("%d%d", &newRow, &newCol);
	printf("请输入要插入的位置的点坐标(若该点不存在则追加在链表末尾):\n");//再考虑,该点不存在返回插入失败
	scanf("%d%d", &oldRow, &oldCol);

	changePointValue(&oldPoint, oldRow, oldCol);
	oldPoint.next = NULL;

	pre = searchPreToPoint(*hp, oldPoint);
	p = makeOnePoint(newRow, newCol);
	p->next = NULL;
	if(pre = NULL)
	{
		p->next = *hp;   //头插
		*hp = p;
	}
	else
	{
		p->next = pre->next;  //运行到这里的时候,程序崩溃,不只是什么原因? 
		pre->next = p;
	}

	//若要插入一个点,那么首先得找到插入的位置的点坐标。也就是找到该点的前驱节点
	//那么继续编写一个找寻前驱结点的函数searchPreToPoint();
}

void destroyPointLink(POINT **h)
{
	POINT *p;

	while(*h)
	{
		p = *h;
		*h = p->next;
		free(p);
	}
}

void showOnePoint(POINT p)
{
	printf("<%d, %d> ", p.row, p.col);  //若有多处显示,并且要改动显示型式,那么只需要改动函数里边即可
}

void showPoints(POINT *h)
{
	POINT *p;

	printf("\n当前点坐标如下:\n");
	for(p = h; p; p = p->next)
		showOnePoint(*p);	
}

void initPointLink(POINT **h)
{
	POINT *p; //用来指向申请到的神节点
	POINT *q; //用来指向末节点
	int row;
	int col;

	if(*h)   //如果链表在使用前非空,那么将要清空链表
		destroyPointLink(h);
	//如何清空链表?
	//1、*h != NULL条件成立,即,找到末节点,然后free();即可。

	printf("请输入点的坐标:例如:3 4.注意:任意坐标值为0时,结束输入:");
	scanf("%d%d", &row, &col);
	while(row&&col)    //只要任意坐标不为0,就继续录入点的坐标
	{
		p = makeOnePoint(row, col);	
		//完成上边的申请新的节点之后。考虑:如何将这些点串成链表?
		//1、如何链表为空那么直接让头指针指向申请到的节点;
		//2、如果链表不为空,那么则将申请到的新的节点追加在原来的节点的后面
		if(*h==NULL)
			*h = p;
		else
			q->next = p;
		q = p;
		
		printf("请输入点的坐标:例如:3 4.注意:任意坐标值为0时,结束输入:");
		scanf("%d%d", &row, &col);
	}
}

void main(void)
{
	POINT  *Head1 = NULL; //产生一个空链表

	initPointLink(&Head1);
	showPoints(Head1);

	insertPointToLink(&Head1);
	showPoints(Head1);

	destroyPointLink(&Head1);
	showPoints(Head1);

	getch();
//	system("pause");
}

全部评论
程序运行到第87行的时候,自动崩溃,显示非法访问内存。 我检查之后,并没有发现,指针乱用的情况。希望有大神帮忙! 程序其他函数经检验,没有错误,仅仅是insertPointToLink();函数的问题!
点赞 回复 分享
发布于 2015-08-05 19:35

相关推荐

本神尊:看来是没招到小红薯上的人
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-25 20:45
点赞 评论 收藏
分享
大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务