鱼C论坛

 找回密码
 立即注册
查看: 2427|回复: 1

[技术交流] 零基础C视频-->57节 动态链表的创建与新的节点的插入!源码!

[复制链接]
发表于 2011-9-19 12:28:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Y.H 于 2011-9-19 12:29 编辑

通常从一段代码的初稿(未优化)就能看作者的最初思路!


所以 我就把这一节的原初稿代码(未优化) 发出来:
个人觉得初稿一半都是作者最初的一个构思(觉得是最具有逻辑(当然啦不是逻辑最强的)的,因为那是一步一步按照最初的算法而来的) 优化后逻辑性更强:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

struct student
{
      long int num;
      long double score;
      struct student *next;
};

void main()
{
      struct student *p1, *p2, *head, *p;
      int n;
      long int Temp_Num;
      
      n = 0;
      head = NULL;
      p1 = p2 = (struct student *)malloc(sizeof (struct student));
      
      printf ("input Num : ");
      scanf ("%ld", &p1->num);
      printf ("input Score : ");
      scanf ("%lf", &p1->score);
      
      while (p1->num)
      {
            n++;

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

            p2 = p1;
            p1 = (struct student *)malloc(sizeof (struct student));           //开辟新节点 使p1指向这个节点.
            
            printf ("input Num : ");                                          //读入一个num给p1所指的节点.
            scanf ("%ld", &p1->num);
            printf ("input Score : ");
            scanf ("%lf", &p1->score);            
      }
      
      p2->next = NULL;                                                        //p2->next = NULL
      p = head;

      printf ("\ninput %ld number\n\n", n);
      printf ("Num\t\t\tScore\n");      

      if (head)
      {
            do
            {
                  printf ("%ld\t\t\t%3.2lf\n", p->num, p->score);                  
            }
            while (p = p->next);
      }
      

      
      p1 = head;
      p2 = head;
      p = (struct student *)malloc(sizeof (struct student));
      printf ("\n\nplease input insert Num: ");      //按照(num)数字前后顺序插入节点
      scanf ("%ld", &p->num);
      printf ("please input insert score: ");
      scanf ("%lf", &p->score);

      if (head == NULL)                                     //如果是空链表的情况.
      {
            head = p;
            head->next = NULL;
            n++;
      }

      else
      {
            while (p->num > p1->num && p1->next != NULL)                                              
            {
                  p2 = p1;
                  p1 = p1->next;
            }
            if (p->num >= p1->num && p1->next == NULL)             //如果要插入的节点为最后面
            {
                  p1->next = p;
                  p->next = NULL;
                  n++;
            }                                                     //如果要插入的节点为最后面


            else if (p->num <= p2->num && p2 == head)              //如果要插入的节点排序为第一个
            {
                  p->next = p1;
                  head = p;
                  n++;
            }                                                     //如果要插入的节点排序为第一个

      
            else if (p->num >= p2->num && p->num <= p1->num)        //如果要插入的节点在链表中间                           
            {
                  p2->next = p;
                  p->next = p1;
                  n++;
            }                                                     //如果要插入的节点在链表中间
      }
      p1 = head;

      printf ("\ninput %ld number\n\n", n);
      printf ("Num\t\t\tScore\n"); 

      

      if (head)
      {
            do
            {
                  printf ("%ld\t\t\t%3.2lf\n", p1->num, p1->score);                  
            }
            while (p1 = p1->next);
      }


      system("pause");
}
最后哦 不要骂我这代码乱  其实我也懒的优化了!
这个主要还是放在插入的部分上!

呵呵呵 热烈欢迎捶我 但别骂我!


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-19 12:53:48 | 显示全部楼层
好吧 沙发 自己占了
这个又加了一个循环插入的功能 但是 没有检查输入是否正确的问题:
代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

struct student
{
      long int num;
      long double score;
      struct student *next;
};

void main()
{
      struct student *p1, *p2, *head, *p;
      int n;
      long int Temp_Num;
      
      n = 0;
      head = NULL;
      p1 = p2 = (struct student *)malloc(sizeof (struct student));
      
      printf ("input Num : ");
      scanf ("%ld", &p1->num);
      printf ("input Score : ");
      scanf ("%lf", &p1->score);
      
      while (p1->num)
      {
            n++;

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

            p2 = p1;
            p1 = (struct student *)malloc(sizeof (struct student));           //开辟新节点 使p1指向这个节点.
            
            printf ("input Num : ");                                          //读入一个num给p1所指的节点.
            scanf ("%ld", &p1->num);
            printf ("input Score : ");
            scanf ("%lf", &p1->score);            
      }
      
      p2->next = NULL;                                                        //p2->next = NULL
      p = head;

      printf ("\ninput %ld number\n\n", n);
      printf ("Num\t\t\tScore\n");      

      if (head)
      {
            do
            {
                  printf ("%ld\t\t\t%3.2lf\n", p->num, p->score);                  
            }
            while (p = p->next);
      }
      

      
            p1 = head;
            p2 = head;
            p = (struct student *)malloc(sizeof (struct student));
            printf ("\n\nplease input insert Num: ");      //按照(num)数字前后顺序插入节点
            scanf ("%ld", &p->num);
            printf ("please input insert score: ");
            scanf ("%lf", &p->score);

      while (1)
      {
            if (head == NULL)                                     //如果是空链表的情况.
            {
                  head = p;
                  head->next = NULL;
                  n++;
            }

            else
            {
                  while (p->num > p1->num && p1->next != NULL)                                              
                  {
                        p2 = p1;
                        p1 = p1->next;
                  }
                  if (p->num >= p1->num && p1->next == NULL)             //如果要插入的节点为最后面
                  {
                        p1->next = p;
                        p->next = NULL;
                        n++;
                  }                                                     //如果要插入的节点为最后面


                  else if (p->num <= p2->num && p2 == head)              //如果要插入的节点排序为第一个
                  {
                        p->next = p1;
                        head = p;
                        n++;
                  }                                                     //如果要插入的节点排序为第一个

      
                  else if (p->num >= p2->num && p->num <= p1->num)        //如果要插入的节点在链表中间                           
                  {
                        p2->next = p;
                        p->next = p1;
                        n++;
                  }                                                     //如果要插入的节点在链表中间
            }
            p1 = head;

            printf ("\ninput %ld number\n\n", n);
            printf ("Num\t\t\tScore\n"); 

      

            if (head)
            {
                  do
                  {
                        printf ("%ld\t\t\t%3.2lf\n", p1->num, p1->score);                  
                  }
                  while (p1 = p1->next);
            }
    
      
            //这里实现多次插入.

            printf ("如果要再一次插入请直接输入数据\n\n否则要退出请按数字 0 : ");
            p1 = head;
            p2 = head;
            p = (struct student *)malloc(sizeof (struct student));
            scanf ("%ld", &p->num);
            printf ("请输入相应的分数: ");
            scanf ("%lf", &p->score);
            if (0 == p->num)
            {
                  printf ("\n退出\n");
                  break;
            }
      }

      system("pause");
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-20 19:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表