zoukankan      html  css  js  c++  java
  • 有两个链表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;
    }
  • 相关阅读:
    CodeForces
    处女座的测验(一)(素数筛+思维)
    Codeforces-D-Diverse Garland(思维)
    linux中open函数使用
    linux管道通信
    linux中memset的正确用法
    在linux中read、write函数
    Ubuntu+Win7+Samba实现文件共享
    【转】教你如何实现linux和W…
    《转》我的ARM学习经历
  • 原文地址:https://www.cnblogs.com/qixin622/p/1239002.html
Copyright © 2011-2022 走看看