`
蒙面考拉
  • 浏览: 155723 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

编程笔记(07-24)

 
阅读更多
 1 #include < stdio.h >
 2
 3 struct  llist
 4 {
 5      int  num;
 6     char  name[ 10 ];=>改成:string name;

 7      struct  llist  * next;
 8 }
;
 9 typedef  struct  llist node;
10 typedef node  * llink;
11
12
13 /**/ /* 链表的创建 */
14 llink createllist()
15 {
16     llink head;
17     llink ptr,ptr1;
18      int  i;
19     
20     head  =  (llink)malloc( sizeof (node));             // 分配第一个节点 =>head=new node
21      if ( ! head)
22          return  NULL;    
23     printf( " 请输入六项邮寄数据:\n " );
24     printf( " 请输入编号 ==>  " );
25     scanf( " %d " , & head -> num);=>
cin>>head->num;
26     printf( " 请输入编号(%d)的姓名 ==>  " ,head -> num);
27     scanf( " %s " ,head -> name);=>改成:cin.sync();string lname; cin>>lname;head->name=lname;
28     head -> next  =  NULL;
29     ptr  =  head;    
30      for (i  =   1 ;i  <   6 ; i ++ )
31      {
32         ptr1  =  (llink)malloc( sizeof (node));=>ptr1
=new node ;
33          if ( ! ptr1)
34              return  NULL;
35         printf( " 请输入编号 ==>  " );
36         scanf( " %d " , & ptr1 -> num);=>cin>>ptr1->num;
37         printf( " 请输入编号(%d)的姓名 ==>  " ,ptr1 -> num);
38         scanf( " %s " ,ptr1 -> name);=>
cin.sync();string lname; getline(cin,lname);head->name=lname;
39         ptr1 -> next  =  NULL;
40         ptr  ->  next  =  ptr1;
41         ptr  =  ptr  -> next;
42     }

43      return  head;
44 }

45
46 /**/ /* 链表的节点遍历 */
47 llink findnode(llink head, int  num)
48 {
49     llink ptr;
50     
51     ptr  =  head;
52      while (ptr  !=  NULL)
53      {
54          if (ptr -> num  ==  num)
55              return  ptr;
56         ptr  =  ptr -> next;
57     }

58      return  ptr;
59 }

60
61
62 void  main()
63 {
64     llink head;
65     llink ptr;
66      int  num;
67     
68     head  =  createllist();
69      if ( ! head)
70      {
71         printf( " 内存分配失败!\n " );
72         exit( 1 );
73     }

74      while ( 1 )
75      {
76         printf( " 请输入要寻找的邮寄编号 ==>  " );
77         scanf( " %d " , & num);
78          if (num  !=   0 )
79          {
80             ptr  =  findnode(head,num);
81              if ( ! ptr)
82                 printf( " 没有找到\n " );
83              else
84                 printf( " 姓名:%s\n " ,ptr -> name);
85         }

86          else
87             exit( 1 );
88     }

89 }
我们将代码做相应红色的改动。将结构体的name的类型改成string。我们必须注意到以下几点:
1. 我们用cin输入num之后,我们又用cin输入lname(cin>>lname或者getline(cin,lname))。在这之前我们需要调用cin.sync()(清空缓存区)或者fflush(stdin)(清空缓存区)或者getchar()(读取一个字符),因为上一次输入num之后还有一个回车字符留在stdin流中,影响lname的读取,lname会直接被读取为回车。
  2. 第20行以及32行,如果结构体name的类型是string,而我们分配内存的方式是malloc的话程序回报错。没有初始    化,name的内存地址有问题,没法用head->name=lname来给其赋值。这时我们应该使用new。两者之间的不同:
  1. malloc和free是C语言的标准库函数,而new和delete是C++的运算符。他们都是用于申请动态内存和释放内存
  2. 对于非内部数据类型 的对象而言,用maloc和free无法满足动态对象的要求。对象在创建的同时要求自动执行构造函数,消亡时自动执行析够函数。由于两者是库函数不是运算符,不再编译器控制范围内,没法把执行构造和析构函数的任务给malloc和free。
  3. 运算符new能完成动态内存分配和初始化 的工作。delete能完成清理和释放内存的工作。
  4. malloc和free仍然保存的原因:C++程序经常调用C程序,C程序只能使用这两个函数来管理动态内存。
  5. 两者之间的其他不同:new不需要头文件,malloc需要头文件库函数支持。new建立的是一个对象 ,而malloc分配的是一个内存。正因为new建立的是一个对象,所以才会调用对象里面的构造函数来进行初始化。malloc仅仅只能分配内存,free仅仅回收内存。
3. exit():参数为零时表示正常退出,参数非零时表示非正常退出。
4. 在c++中不能用加法操作符将两个字符串字面值相加 ,语法错误。
5. getch()和getchar()的区别:前者当你敲击某个键的时候就立即返回了,正常情况下读取的是你敲击的符号。后者可接受多个字符,直到回车才返回,但是第一个字符作为函数的返回值。使用功能之一:scanf()函数在输入时以回车作为结束的标志。但是并没有接受这个回车键,getchar()则用来接收这个回车键。如果缺省,将会影响下面的scanf()语句。因为如果不是用getchar()接收则下面的scanf()将首先接收到这个回车符号,将会导致一些列错误。当然我们也可以使用getch()来实现这个目的。







分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics