最近在学单链表的基本操作,增删查改这些。这两天自己改了改完善了一下
#include<stdio.h>
#include<stdlib.h>
typedef struct link{
int value;
struct link *next;
}Link;
Link* init_list(void);//初始化
void display(Link *p);//链表输出
int search(Link *p,int value);//查找某元素
Link* insert(Link *p,int value,int location);//增加元素(插入)
Link* del(Link *p,int location);//删除元素
Link* replace(Link *p,int location,int value);//替换元素
/*******************************************/
int main()
{
int object,address=0;
int data,add;
int cut;
int place,new_data;
Link *q=init_list();
printf("初始化链表为\n");
display(q);
printf("请输入你要查找的元素\n");
scanf("%d",&object);
address=search(q,object);
if(address!=-1)
{
printf("该数在第%d号位。\n",address);
}
else
{
printf("未找到该数!\n");
}
printf("请输入插入数据的位置\n");
scanf("%d",&add);
printf("请输入要插入的数据\n");
scanf("%d",&data);
insert(q,data,add);
display(q);
printf("请输入要删除的数的位置:\n");
scanf("%d",&cut);
del(q,cut);
display(q);
printf("请输入要替换的数据的位置\n");
scanf("%d",&place);
printf("请输入新的数据\n");
scanf("%d",&new_data);
replace(q,place,new_data);
display(q);
return 0;
}
/******************************************/
Link* init_list(void)
{
re_input:
;
int x=0;
int mask=0,count=0;
Link* head=NULL;
Link *p=(Link*)malloc(sizeof(Link*));
head=p;
printf("请输入数据(输入-1结束)\n");
do
{
mask=scanf("%d",&x);
if(x!=-1&&mask!=0)
{
Link *a=(Link*)malloc(sizeof(Link*));
a->value=x;
a->next=NULL;
head->next=a;
head=head->next;
count++;
}
else if(x==-1&&count!=0){
break;
}
else
{
printf("输入中含有非法字符,请重新输入!\n");
fflush(stdin);
goto re_input;
}
}while(x!=-1);
return p;
}
/************************************************/
int search(Link *p,int value)
{
int i=1;
Link *temp=p;
while(temp->next!=NULL){
temp=temp->next;
if(temp->value==value){
return i;
}
i++;
}
return -1;
}
/************************************************/
Link* insert(Link *p,int value,int location)
{
int i;
Link *temp=p;
for(i=1;i<location;i++){
if(temp->next==NULL)
{
printf("插入位置无效!\n");
return p;
}
temp=temp->next;
}
Link *b=NULL;
b=(Link*)malloc(sizeof(Link*));
b->value=value;
b->next=temp->next;
temp->next=b;
return p;
}
/****************************************/
Link* del(Link *p,int location)
{
int i;
Link *temp=p;
Link *del=NULL;
for(i=1;i<location;i++) {
if(temp->next==NULL)
{
printf("删除位置无效!\n");
return p;
}
temp=temp->next;
}
del=temp->next;
temp->next=temp->next->next;
free(del);
return p;
}
/****************************************/
Link* replace(Link *p,int location,int value)
{
int i;
Link *displace=NULL;
Link *temp=p;
for(i=1;i<location;i++){
if(temp->next==NULL)
{
printf("替换的位置无效!\n");
return p;
}
temp=temp->next;
}
Link *c=(Link*)malloc(sizeof(Link*));
c->value=value;
displace=temp->next;
c->next=temp->next->next;
temp->next=c;//这行与上一行顺序不能乱
free(displace);
return p;
}
/******************************************/
void display(Link *p)
{
Link* temp=p;
while(temp->next!=NULL)
{
temp=temp->next;
printf("%d ",temp->value);
}
printf("\n");
}
编译运行都没问题,但是调试的时候,在del函数中,到free(del);这一行的时候,继续单步执行就会报错
Thread 1 received signal SIGTRAP,Trace/breakpoint trap.
查了一下网上看不懂,感觉这是不是涉及到高级一点的领域了?
求能不能简单的说一下这个错误出现的原因及解决。