结构体与共用体05 - 零基础入门学习C语言57

第十章:结构体与共用体05

 

让编程改变世界

Change the world by program


 

对链表结点的删除操作实现

  实现源代码: [codesyntax lang="c"]
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define LEN sizeof(struct student)  // student结构的大小

struct student *creat();   // 创建链表
struct student *del( struct student *head, int num);  // del函数用于删除结点, *head即链表
                                                      // 的头指针, num是要删除的结点num。
void print(struct student *head);   // 打印链表

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

int n;    // 全局变量,用来记录存放了多少数据。

void main()
{
      struct student *stu, *p;
      int n;

      stu = creat();
      p = stu;
      print( p );

      printf("Please enter the num to delete: ");
      scanf("%d", &n);
      print( del(p, n) );

      printf("nn");
      system("pause");
}

struct student *creat()
{
      struct student *head;
      struct student *p1, *p2;

      p1 = p2 = (struct student *)malloc(LEN);  // LEN是student结构的大小

      printf("Please enter the num :");
      scanf("%d", &p1->num);
      printf("Please enter the score :");
      scanf("%f", &p1->score);

      head = NULL;     
      n = 0;    

      while( p1->num )
      {
            n++;
            if( 1 == n )
            {
                  head = p1;                 
            }
            else
            {
                  p2->next = p1;
            }

            p2 = p1;
            p1 = (struct student *)malloc(LEN);

            printf("nPlease enter the num :");
            scanf("%d", &p1->num);
            printf("Please enter the score :");
            scanf("%f", &p1->score);
      }

      p2->next = NULL;

      return head;
}

void print(struct student *head)
{
      struct student *p;
      printf("nThere are %d records!nn", n);

      p = head;
      if( head )
      {
            do
            {
                  printf("学号为 %d 的成绩是: %fn", p->num, p->score);
                  p = p->next;
            }while( p );
      }
}

struct student *del( struct student *head, int num)
{
      struct student *p1, *p2;

      if( NULL == head ) // 如果头结点指向NULL,这是一个空链表。纯属忽悠T_T
      {
            printf("nThis list is null!n");
            goto END;
      }

      p1 = head;
      while( p1->num != num && p1->next != NULL)
      {
            p2 = p1;
            p1 = p1->next;
      }
      if( num == p1->num )
      {
            if( p1 == head )      // 当将要删除的结点位于头结点的时候
            {
                  head = p1->next;
            }
            else                  // 一般情况
            {
                  p2->next = p1->next; 
            }

            printf("nDelete No: %d succeed!n", num);
            n = n-1; // n是作为一个全局变量,用来记录链表的数据数。
      }
      else
      {
            printf("%d not been found!n", num);
      }

END:
      return head;
}
[/codesyntax]  

对链表的插入操作

对链表的插入是指将一个结点插入到一个已有的链表中。

为了能做到正确插入,必须解决两个问题:

① 怎样找到插入的位置; ② 怎样实现插入。   我们可以先用指针变量p0指向待插入的结点,p1指向第一个结点。将p0->num与p1->num相比较,如果p0->num>p1-> num ,此时将p1后移,并使p2指向刚才p1所指的结点。   [caption id="attachment_195" align="aligncenter" width="300"] 对链表的插入操作[/caption] [caption id="attachment_196" align="aligncenter" width="300"] 对链表的插入操作[/caption]   我们设计出程序: homework_3.c下载源代码) 但是这个程序有些问题需要大家齐心协力来发掘并研究方法解决! 例如我们要实现多次插入,问题就来了!  

课后练习

尝试实现插入程序并尝试制作一个学生成绩管理系统。   [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LITOIYLWFRXQ']视频下载[/Downlink]
posted @ 2011-03-28 02:55  我就爱小甲鱼  阅读(201)  评论(0编辑  收藏  举报