有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。

#include <stdio.h>
#include 
<stdlib.h>
#define N 10
typedef 
struct student
{
    
int num;
    
float score;
    
struct student *next;
}STU;

STU 
*create()
{
    
int i;
    STU 
*p,*head=NULL,*tail=head;
    
for (i=0;i<N;i++)
    {
        p
=(STU *)malloc(sizeof(STU));
        scanf(
"%d%f",&p->num,&p->score);
        p
->next=NULL;
        
if (p->num<0)
        {
            free(p);
            
break;
        }
        
if(head==NULL)
            head
=p;
        
else
            tail
->next=p;
        tail
=p;
    }
    
return head;
}

void output(STU *p)
{
    
while (p!=NULL)
    {
        printf(
"%d\t%.2f\n",p->num,p->score);
        p
=p->next;
    }
}

STU 
*del(STU *a,STU *b)
{
    STU 
*head,*p1,*p2;
    p1
=p2=head=a;                        //让p1、p2、head结点指向链表a的头部
    while (b!=NULL)
    {
        p1
=p2=head;                        //每次循环前让p1、p2始终指向删除后链表的头部
        while (p1!=NULL)
        {    
            
if (b->num==p1->num)        //学号相同,删除结点信息
                if(p1==head)            //如果删除的是头结点,则头结点位置要后移
                {
                    head
=p1->next;
                    free(p1);
                    p1
=p2=head;
                }
                
else                    //如果删除的是中间结点
                {
                    p2
->next=p1->next;
                    free(p1);
                    p1
=p2->next;
                }
            
else                        //学号不同,则p1,p2指针依次后移
            {
                p2
=p1;
                p1
=p1->next;
            }
        }
        b
=b->next;
    }
    
return head;
}

int main(int argc, char *argv[]) 
{
    STU 
*a,*b,*c;
    printf(
"\n请输入链表a的信息,学号小于零时结束输入:格式(学号 成绩)\n");
    a
=create();
    printf(
"\n请输入链表b的信息,学号小于零时结束输入:格式(学号 成绩)\n");
    b
=create();
    system(
"cls");
    printf(
"\n链表a的信息为:\n");
    output(a);
    printf(
"\n链表b的信息为:\n");
    output(b);
    c
=del(a,b);
    printf(
"\n删除后的链表信息为:\n");
    output(c);

    
return 0;
}
posted @ 2008-07-09 16:06  齐心  Views(4746)  Comments(0Edit  收藏  举报