我的程序你没有运行?或者运行后还是有问题?
修改后的程序分别在WIN2003+VC,WIN2003+BCB,SOLARIS+GCC以及UBUNTU+GCC中测试过,各项功能完全正常,可以正常删除结点。
*****************************************
struct list
{ int data;
struct list *next;
};
改为:
typedef struct list
{ int data;
struct list *next;
} list;
去掉 #include
还有其它一些小修改,修改后的程序如下:
#include
#include
typedef struct list
{ int data;
struct list *next;
} list;
struct list *creat_n(void)//创建有n个元素的链表
{
int n,i;
struct list *q,*p,*head=NULL;
printf("输入你所要创建的结点数");
scanf("%d",&n);
head=p=(list*)malloc(sizeof(list));
printf("输入该结点的值:");
scanf("%d", &p->data);
p->next=NULL;
for(i=n-1;i>=1;i--)
{
q=p;
p=(list*)malloc(sizeof(list));
printf("输入该结点的值:");
scanf("%d", &p->data);
q->next=p;
}
p->next=NULL;
return head;
}
struct list * output(struct list *head)//输出表长与结点值
{ int j=0;
struct list *p;
p=head;
while(p!=NULL)
{ j++;
printf("%d\n",p->data);
p=p->next;
}
printf("当前的表长是:%d\n",j);
return head;
}
int insert(struct list *head)//插入结点函数
{
struct list *k,*p,*q;
int x;
printf("请输入你要在哪个结点值之前插入新结点");
scanf("%d",&x);
k=(list*)malloc(sizeof(list));
printf("请输入新结点的值");
scanf("%d",&k->data);
k->next=NULL;
if(head==NULL)
head=k;
else if(head->data==x)//在第一个结点前插入新结点
{
k->next=head;
head=k;
printf("插入成功\n");
}
else
{
q=head;
p=head->next;
while( p!=NULL && p->data!=x )
{
q=p;
p=p->next;
}
if (p==NULL) {
printf("\n该结点不存在\n");
return 0;
}
if(p->data==x)//在要求的X结点前插入新结点
{
k->next=p;
q->next=k;
printf("插入成功\n");
}
else//在链表末插入新结点
p->next=k;
}
output(head);
}
int delet(struct list *head)//删除结点函数
{
struct list *q,*p;
int x,y;
printf("请输入你所要删除的结点值:");
scanf("%d",&x);
if(head==NULL)//表空
{
printf("表空");
return 0 ;
}
else if(x==head->data)//第一个结点为删除的结点
{
q=head;
head=head->next;
y=q->data;
free(q);
printf("删除成功");
return(y);
}
else
{
q=head;
p=head->next;
while(p->data!=x && p!=NULL)
{
q=p;
p=p->next;
}
if(x==p->data)//删除值为X的结点
{
q->next=p->next;
y=p->data;
free(p);
printf("删除成功");
return (y);
}
else
printf("表中没有指定的结点");
}
output(head);
return 0;
}
void main()
{
struct list *head;
int x,y;
head=creat_n();
output(head);
insert(head);
delet(head);
output(head);
}