帮忙找错,拆分单链表。
将单链表拆分为2个,原表保留偶数,奇数结点安原来次序组成新表。不知道是不是这样做啊,高手帮忙看看。
有错是肯定的,就是不知道错在哪。
#include <stdio.h>
#include <malloc.h>
#define M 5
typedef int datatype;
typedef struct link_node{
datatype info;
struct link_node *next;
}node;
// 建立空单链表。
node *init(){
return NULL;//建立单链表。
}
//输出各结点的值。
void display(node *head){
node *p;
p=head;
if(!p)printf("\n单链表是空的");
else{
while(p){
printf("%5d",p->info);
p=p->next;}
printf("\n");
}
}
//查找第i个结点的地址。
node *find(node *head,int i){
int j=1;
node *p=head;
if(i<1)return NULL;
while(p&&i!=j){
p=p->next;j++;
}
return p;
}
//建立单链表。
node insert(node *head,datatype x,int i){
node *p,*q;
q=find(head,i);
if(!q&&i!=0)
printf("\n找不到第%d个结点,不能插入%d!",i,x);
else{
p=(node*)malloc(sizeof(node));
p->info=x;
if(i==0){
p->next=head;
head=p;
}
else{
p->next=NULL;
q->next=p;
}
}
return *head;
}
//删除结点
node *dele(node *head,datatype x){
node *pre=NULL,*p;
if(!head){printf("单链表是空的!");return head;}
p=head;
while(p&&p->info!=x)
{pre=p;p=p->next;}
if(p)
{
if(!pre) head=head->next;
else pre->next=p->next;
free(p);
}
return head;
}
//拆分链表
void sy3_2(node *head1,node *head2){
int i,j;
node *p,*q;
p=head1;
for(j=0,i=0;i<M;i++)
{if(p->info%2)
{
*head2=insert(head2,p->info,j);
printf("%d\n",head2->info);
p->next=q;
head1=dele(head1,p->info);
j++;
}
p=q;}
}
//主函数
void main(){
node biao1,biao2;
int i;
datatype x;
init();
printf("输入原单链表。\n");
for(i=0;i<M;i++)
{scanf("%d",&x);
biao1=insert(&biao1,x,i);
}
sy3_2(&biao1,&biao2);
printf("\n单链表1各结点值为:\n");
display(&biao1);
printf("\n单链表2各结点值为:\n");
display(&biao2);
}