线性表的插入、删除的程序,帮忙看看出什么问题呢?
#include <stdio.h>#include<malloc.h>
typedef struct node *pointer;/*定义变量*/
struct node
{
int data;
pointer next;
};
typedef pointer lklist;
lklist create_lklist()/*建表*/
{
lklist head,p,q;
int x;
head=(node *)malloc(sizeof(struct node));
p=head; //头结点 ,什么都不放,只是个指向lklist的指针
printf("\n请输入数据:\n");
scanf("%d",&x);
while(x!=-1) //当输入-1是输入结束
{
q=(node *)malloc(sizeof(struct node)); //开拓一个存储空间
q->data=x;
p->next=q; //连上
p=q;
printf("\n请输入数据:\n"); //继续循环
scanf("%d",&x);
} //-1时结束
p->next=NULL; //p是移动的,从头到尾一直都作为装卸工。最后,q赋给了p,后将q 中的next赋予NULL
return(head); //将头结点返回,这样就可以提纲挈领了。
}
void out_lklist(lklist head)/*输出*/
{
int i=0;
lklist p=head; //此处p作用也是装卸工,不过此处是将一个链表的头结点给过来,然后就一个个读取。
while(p->next!=NULL) //当链表到达结尾时就结束循环
{
p=p->next; //先移向下一个节点
i++; //位置标示量再加一
printf("\n结点%d数据为:%d",i,p->data);
}
return;
}
lklist find_lklist(lklist head,int n)//寻找
{
int i=1,c=0;
lklist p=head;
while( i!=n )//p!=NULL && p->next !=NULL
{
i++;
if(p==NULL || p->next==NULL)
{
printf("链表为空!\n");
break;
}
p=p->next;
}
return p;
}
void del_lklist(lklist head,int i)/*删除*/
{
lklist p,q;
int e;
p=find_lklist(head,i-1);
if((p!=NULL)||(p->next!=NULL)) //判断此链表是否为空
{
q=p->next; //注意:是先指向下一个再释放空间!
p->next=q->next;
e=q->data;
free(q);
}
else
{
printf("\n不存在第%d个结点",i); //若为空,则打印这句话
return;
}
return;
}
void insert_lklist(lklist head,int x,int i) //插入,在第i个节点那里插入x;
{
lklist p,s;
p=find_lklist(head,i-1); //寻找第i-1个节点
if(p==NULL)
{
printf("\n不存在第%d个位置",i); //如果第i-1 个节点是空,就打印“没有”;
return;
}
else
{
s=(node *)malloc(sizeof(struct node)); //否则,就在其后面添加一个节点,插入x。
s->next=p->next;
p->next=s;
s->data=x;
return;
}
}
int main()
{
lklist head1;
int y,z;
head1=create_lklist();
out_lklist(head1);
printf("\n请输入插入数据:\n");
printf("\n请输入插入序号:\n");
scanf("%d,%d",&y,&z);
insert_lklist(head1,y,z);
out_lklist(head1);
printf("\n请输入删除结点序号:\n");
scanf("%d",&y);
del_lklist(head1,y);
out_lklist(head1);
return 0;
}