课外天地 李树青学习天地C语言程序设计 → [推荐]第十二课代码讲义:链表节点的删除与插入操作


  共有12348人关注过本帖树形打印复制链接

主题:[推荐]第十二课代码讲义:链表节点的删除与插入操作

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1939 积分:26594 威望:0 精华:34 注册:2003/12/30 16:34:32
[推荐]第十二课代码讲义:链表节点的删除与插入操作  发帖心情 Post By:2015/12/12 9:03:58 [只看该作者]

删除节点:
先考虑删除中间的节点情况
#include <stdio.h>
#define NULL 0
#define LEN sizeof (struct student)

struct student
{
    long num;
    float score;
    struct student *next;
};

void main()
{
    struct student *creat(void);
    struct student *p=creat();
    print(p);
    int number;
    printf("请输入需要删除的学号:");
    scanf("%d",&number);
    del(p,number);
    print(p);
}

void print(struct student *p)
{
    while(p!=NULL)
    {
        printf("%ld  %5.1f\n",p->num,p->score);
        p=p->next;
    }
}

struct student *creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student *) malloc(LEN);
    scanf("%ld,%f",&p1->num, &p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc (LEN);
        scanf("%ld,%f",&p1->num, &p1->score);
    }
    p2->next=NULL;
    return(head);
}

void del(struct student *header,int number)
{
    struct student *p1,*p2;
    p1=header;
    p2=header;
    while(1)
    {
        if(p1->num==number)
        {
            p2->next=p1->next;
            break;
        }
        else
        {
            p2=p1;
            p1=p1->next;
        }
    }
}

增加对第一个节点的删除情况
为什么不对?
#include <stdio.h>
#define NULL 0
#define LEN sizeof (struct student)

struct student
{
    long num;
    float score;
    struct student *next;
};

void main()
{
    void del(struct student *header,int number);
    void print(struct student *p);
    struct student *creat(void);
    struct student *p=creat();
    print(p);
    int number;
    printf("请输入需要删除的学号:");
    scanf("%d",&number);
    del(p,number);
    print(p);
}

void print(struct student *p)
{
    while(p!=NULL)
    {
        printf("%ld  %5.1f\n",p->num,p->score);
        p=p->next;
    }
}

struct student *creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student *) malloc(LEN);
    scanf("%ld,%f",&p1->num, &p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc (LEN);
        scanf("%ld,%f",&p1->num, &p1->score);
    }
    p2->next=NULL;
    return(head);
}

void del(struct student *header,int number)
{
    struct student *p1,*p2;
    p1=header;
    p2=header;
    while(1)
    {
        if(p1->num==number)
        {
            if(p1==header)
   {
    header=p1->next;
    break;
   }
   else
    p2->next=p1->next;
   break;

        }
        else
        {
            p2=p1;
            p1=p1->next;
        }
    }
}


改正:
#include <stdio.h>
#define NULL 0
#define LEN sizeof (struct student)

struct student
{
    long num;
    float score;
    struct student *next;
};

void main()
{
    struct student *del(struct student *header,int number);
    void print(struct student *p);
    struct student *creat(void);

    struct student *p=creat();
    print(p);
    int number;
    printf("请输入需要删除的学号:");
    scanf("%d",&number);
    p=del(p,number);
    print(p);
}

void print(struct student *p)
{
    while(p!=NULL)
    {
        printf("%ld  %5.1f\n",p->num,p->score);
        p=p->next;
    }
}

struct student *creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student *) malloc(LEN);
    scanf("%ld,%f",&p1->num, &p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc (LEN);
        scanf("%ld,%f",&p1->num, &p1->score);
    }
    p2->next=NULL;
    return(head);
}

struct student *del(struct student *header,int number)
{
    struct student *p1,*p2;
    p1=header;
    p2=header;
    while(1)
    {
        if(p1->num==number)
        {
            if(p1==header)
   {
    header=p1->next;
    break;
   }
   else
    p2->next=p1->next;
   break;

        }
        else
        {
            p2=p1;
            p1=p1->next;
        }
    }
    return header;
}

考虑没有命中的情况
#include <stdio.h>
#define NULL 0
#define LEN sizeof (struct student)

struct student
{
    long num;
    float score;
    struct student *next;
};

void main()
{
    struct student *del(struct student *header,int number);
    void print(struct student *p);
    struct student *creat(void);

    struct student *p=creat();
    print(p);
    int number;
    printf("请输入需要删除的学号:");
    scanf("%d",&number);
    p=del(p,number);
    print(p);
}

void print(struct student *p)
{
    while(p!=NULL)
    {
        printf("%ld  %5.1f\n",p->num,p->score);
        p=p->next;
    }
}

struct student *creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student *) malloc(LEN);
    scanf("%ld,%f",&p1->num, &p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc (LEN);
        scanf("%ld,%f",&p1->num, &p1->score);
    }
    p2->next=NULL;
    return(head);
}

struct student *del(struct student *header,int number)
{
    struct student *p1,*p2;
    p1=header;
    p2=header;
    while(1)
    {
        if(p1->num==number)
        {
            if(p1==header)
   {
    header=p1->next;
    break;
   }
   else
    p2->next=p1->next;
   break;

        }
        else
        {
            p2=p1;
            p1=p1->next;
            if(p1==NULL)
    break;
        }
    }
    return header;
}

插入节点:
首先考虑在中间插入的情况
#include <stdio.h>
#define NULL 0
#define LEN sizeof (struct student)

struct student
{
    long num;
    float score;
    struct student *next;
};

void main()
{
    void insert(struct student *header,struct student *p0);
    void print(struct student *p);
    struct student *creat(void);

    struct student *p=creat();
    print(p);

    //需要链表元素的学号升序排列
 struct student * p0=(struct student *)malloc(sizeof(struct student));
 printf("请输入要插入的学号和成绩:");
 scanf("%ld,%f",&p0->num,&p0->score);
    insert(p,p0);
    print(p);
}

void print(struct student *p)
{
    while(p!=NULL)
    {
        printf("%ld  %5.1f\n",p->num,p->score);
        p=p->next;
    }
}

struct student *creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student *) malloc(LEN);
    scanf("%ld,%f",&p1->num, &p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc (LEN);
        scanf("%ld,%f",&p1->num, &p1->score);
    }
    p2->next=NULL;
    return(head);
}

void insert(struct student *header,struct student *p0)
{
    struct student *p1,*p2;
    p1=header;
 p2=header;
 while(1)
 {
  if(p1->num<p0->num)
  {
   p2=p1;
   p1=p1->next;
  }
  else if(p1->num>p0->num)
  {
   p2->next=p0;
   p0->next=p1;
   break;
  }
 }
}

考虑在尾部增加的情况
#include <stdio.h>
#define NULL 0
#define LEN sizeof (struct student)

struct student
{
    long num;
    float score;
    struct student *next;
};

void main()
{
    void insert(struct student *header,struct student *p0);
    void print(struct student *p);
    struct student *creat(void);

    struct student *p=creat();
    print(p);

    //需要链表元素的学号升序排列
 struct student * p0=(struct student *)malloc(sizeof(struct student));
 printf("请输入要插入的学号和成绩:");
 scanf("%ld,%f",&p0->num,&p0->score);
    insert(p,p0);
    print(p);
}

void print(struct student *p)
{
    while(p!=NULL)
    {
        printf("%ld  %5.1f\n",p->num,p->score);
        p=p->next;
    }
}

struct student *creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student *) malloc(LEN);
    scanf("%ld,%f",&p1->num, &p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc (LEN);
        scanf("%ld,%f",&p1->num, &p1->score);
    }
    p2->next=NULL;
    return(head);
}

void insert(struct student *header,struct student *p0)
{
    struct student *p1,*p2;
    p1=header;
 p2=header;
 while(1)
 {
  if(p1->num<p0->num)
  {
   p2=p1;
   p1=p1->next;
   if(p1==NULL)
   {
    p2->next=p0;
    p0->next=NULL;
    break;
   }
  }
  else if(p1->num>p0->num)
  {
   p2->next=p0;
   p0->next=p1;
   break;
  }
 }
}

考虑在第一个节点前插入
#include <stdio.h>
#define NULL 0
#define LEN sizeof (struct student)

struct student
{
    long num;
    float score;
    struct student *next;
};

void main()
{
    struct student * insert(struct student *header,struct student *p0);
    void print(struct student *p);
    struct student *creat(void);

    struct student *p=creat();
    print(p);

    //需要链表元素的学号升序排列
 struct student * p0=(struct student *)malloc(sizeof(struct student));
 printf("请输入要插入的学号和成绩:");
 scanf("%ld,%f",&p0->num,&p0->score);
    p=insert(p,p0);
    print(p);
}

void print(struct student *p)
{
    while(p!=NULL)
    {
        printf("%ld  %5.1f\n",p->num,p->score);
        p=p->next;
    }
}

struct student *creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student *) malloc(LEN);
    scanf("%ld,%f",&p1->num, &p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc (LEN);
        scanf("%ld,%f",&p1->num, &p1->score);
    }
    p2->next=NULL;
    return(head);
}

struct student * insert(struct student *header,struct student *p0)
{
    struct student *p1,*p2;
    p1=header;
 p2=header;
 while(1)
 {
  if(p1->num<p0->num)
  {
   p2=p1;
   p1=p1->next;
   if(p1==NULL)
   {
    p2->next=p0;
    p0->next=NULL;
    break;
   }
  }
  else if(p1->num>p0->num)
  {
   if(header==p1)
   {
    header=p0;
    p0->next=p1;
    break;
   }
   else
   {
    p2->next=p0;
    p0->next=p1;
    break;
   }
  }
 }
 return header;
}

考虑等于的情况
#include <stdio.h>
#define NULL 0
#define LEN sizeof (struct student)

struct student
{
    long num;
    float score;
    struct student *next;
};

void main()
{
    struct student * insert(struct student *header,struct student *p0);
    void print(struct student *p);
    struct student *creat(void);

    struct student *p=creat();
    print(p);

    //需要链表元素的学号升序排列
 struct student * p0=(struct student *)malloc(sizeof(struct student));
 printf("请输入要插入的学号和成绩:");
 scanf("%ld,%f",&p0->num,&p0->score);
    p=insert(p,p0);
    print(p);
}

void print(struct student *p)
{
    while(p!=NULL)
    {
        printf("%ld  %5.1f\n",p->num,p->score);
        p=p->next;
    }
}

struct student *creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student *) malloc(LEN);
    scanf("%ld,%f",&p1->num, &p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc (LEN);
        scanf("%ld,%f",&p1->num, &p1->score);
    }
    p2->next=NULL;
    return(head);
}

struct student * insert(struct student *header,struct student *p0)
{
    struct student *p1,*p2;
    p1=header;
 p2=header;
 while(1)
 {
  if(p1->num<p0->num)
  {
   p2=p1;
   p1=p1->next;
   if(p1==NULL)
   {
    p2->next=p0;
    p0->next=NULL;
    break;
   }
  }
  else if(p1->num>p0->num)
  {
   if(header==p1)
   {
    header=p0;
    p0->next=p1;
    break;
   }
   else
   {
    p2->next=p0;
    p0->next=p1;
    break;
   }
  }
  else
  {
   break;
  }

 }
 return header;
}


 回到顶部