#include
#include
#define NULL 0
struct link{
int num;
struct link *next;
};
struct link *creat(void)
{struct link *p1,*p2,*head;
p1=(struct link *)malloc(sizeof(struct link));
scanf("%d",&p1->num);
head=p1;
while(p1->num!=0)//这里一定要以数字0结束,而不能设置成#,因为num是整型。
{
p2=(struct link *)malloc(sizeof(struct link));
scanf("%d",&p2->num);
p1->next=p2;
p1=p2;
}
p1->next=NULL;
return head;
}
void print(struct link *head)
{struct link *p;
printf("\n结果是:\n");
p=head;
//这里不能加p=p->next;因为 p=head;已经是相当是p==head了,不能用谁指向谁来理解
while(p!=NULL)
{
printf("%d",p->num);
printf("\n");
p=p->next;
}
}
struct link *delet(struct link *head,int i)//有问题
{
struct link *p,*q;
int j=0;
p=head;
if(i==1)
{
p=p->next;
head=p;
}
else
{
while(p->next && j<(i-2))
{
p=p->next;
++j;
}
if(!(p->next) || j>i-2)
printf("删除位置不合理");
q=p->next;
p->next=q->next;
free(q);
}
return head;
}
void main()
{
struct link *head1,*head2;
int i;
head1=creat();
print(head1);
printf("\n你要删除第几个数据:\n");
scanf("%d",&i);
head2=delet(head1,i);/*这里一定要用head2与前面的head1区分对待,否则如果如果链表并无改变
而仅仅是头指针指向了第二个结点,那么实际上也是从第一个结点开始输出*/
printf("\n删除后的结果是:\n");
print(head2);
}
http://zhidao.baidu.com/question/192487448.html
之前我写的,你看看。