Code Bye

删除操作无法执行,输入删除位置之后执行下一步,程序就停止运行了

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
createList(int n)//构建链表
{
LinkList s,r;
int i;
L=r=(LinkList)malloc(sizeof(LNode));
//r->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList)malloc(sizeof(LNode));
scanf(“%d”,&s->data);
//s->next=r->next; //表头插入法
//r->next=s;
r->next=s;//表尾插入法
r=s;
}
r->next=NULL;
}
InsertList(LinkList L,int n)//单链表的插入
{
LinkList s,r=L;
int i,j;
printf(“请输入要插入的位置:”);
scanf(“%d”,&j);
s=(LinkList)malloc(sizeof(LNode));
printf(“请输入要插入的数:”);
scanf(“%d”,&(s->data));
if(j<1||j>n+1)
printf(“插入位置错误:”);
else
{
for(i=0;i<j-1;i++)
r=r->next;
s->next=r->next;
r->next=s;
}
return L;
}
[color=#FF0000]DeleteList(LinkList L,int n)//单链表的删除
{
LinkList s,r=L;
int i,j;
printf(“请输入要删除的位置:”);
scanf(“%d”,&j);
if(j<1||j>n+1)
printf(“要删除的位置越界:”);
else
{
for(i=0;i<j;i++)
r=r->next;
s->data=r->data;
printf(“删掉的数为%d”,s->data);
while(r)
{
(r-1)->next=r->next;//被删元素之后的元素左移
}
free(r);
return L;
}
}
OutPutList(LinkList L)//输出链表
{
LinkList p;
p=(LinkList)malloc(sizeof(LNode));//删掉这句还是可以运行
p=L->next;
printf(“表中值为:”);
while(p)
{
printf(“%d “,p->data);
p=p->next;
}
printf(“\n”);
}
int main()
{
int len;
printf(“请输入表长:”);
scanf(“%d”,&len);
printf(“请输入:”);
createList(len);
OutPutList(L);
InsertList(L,len);
OutPutList(L);
DeleteList(L,len);
OutPutList(L);
return 0;
}
解决方案

80

删除操作里,找到要删除的结点后,让它的上一个结点(s)指向待删除结点(r)的next指针指向的结点就行了
ps:你的删除和插入函数也不需要return
#include<stdio.h> 
#include<stdlib.h>  
typedef struct LNode 
{  
	int data;  
	struct LNode *next; 
}LNode,*LinkList;
LinkList L;
void createList(int n)//构建链表
{     
	LinkList s,r;
	int i;
	L=r=(LinkList)malloc(sizeof(LNode)); 
	//r->next=NULL;
	for(i=0;i<n;i++) 
	{  
		s=(LinkList)malloc(sizeof(LNode));
		scanf("%d",&s->data);
		//s->next=r->next; //表头插入法
		//r->next=s;  
		r->next=s;//表尾插入法
		r=s;
	} 
	r->next=NULL;
}
LinkList InsertList(LinkList L,int n)//单链表的插入
{
	LinkList s,r=L;
	int i,j;
	printf("请输入要插入的位置:");
	scanf("%d",&j);
	s=(LinkList)malloc(sizeof(LNode));
	printf("请输入要插入的数:");
	scanf("%d",&(s->data));
	if(j<1||j>n+1)
		printf("插入位置错误:");
	else
	{
		for(i=0;i<j-1;i++)
			r=r->next;
		s->next=r->next;
		r->next=s;
	}
	return L;
}
LinkList DeleteList(LinkList L,int n)//单链表的删除
{
	LinkList s,r=L;
	int i,j,k;
	printf("请输入要删除的位置:");
	scanf("%d",&j);
	if(j<1||j>n+1)
		printf("要删除的位置越界:");
	else
	{
		for(i=0;i<j;i++)
		{
			s = r;
			r=r->next;
		}
		k=r->data;
		printf("删掉的数为%d",k);
		s->next = r->next;
		/*
		while(r)
		{
			(r-1)->next=r->next;//被删元素之后的元素左移
		}
		*/
		free(r);
		return L;
	}
}
void OutPutList(LinkList L)//输出链表
{  
	LinkList p;
	p=(LinkList)malloc(sizeof(LNode));//删掉这句还是可以运行
	p=L->next;
	printf("表中值为:");  
	while(p) 
	{  
		printf("%d ",p->data); 
		p=p->next; 
	}  
	printf("\n"); 
}
int main() 
{   
	int len;
	printf("请输入表长:");
	scanf("%d",&len);
	printf("请输入:");
	createList(len);
	OutPutList(L);
	InsertList(L,len);
	OutPutList(L);
	DeleteList(L,len);
	OutPutList(L);
	return 0;
}

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
代码功能归根结底不是别人帮本人看或讲解或注释出来的;而是被本人静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明删除操作无法执行,输入删除位置之后执行下一步,程序就停止运行了