码迷,mamicode.com
首页 > 其他好文 > 详细

静态链表和动态链表

时间:2015-03-12 20:39:14      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

数据库和数据结构都要用到链表。so 复习一下C的链表(真的是忘光了)。

结构体:(如果结构体中定义了结构体类型的指针,会非常适合于链表的建立)

eg:

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

静态链表要求每个节点都要事先初始化。也就是必须用结构体变量表示它们。也就是事先知道要输入几组数据。

这里定义三组。

 1 #include <stdio.h>
 2 struct Student
 3 {
 4     int num ;
 5     float score;
 6     struct Student * next;
 7 };
 8 int main()
 9 {
10     struct Student a,b,c;
11     //至少要有两个指针,才能满足操作需要
12     struct Student *head,*p;
13     a.num=10101;a.score=89.5;
14     b.num=10103;b.score=90;
15     c.num=10107;c.score=85;
16     head = &a;//头指针
17     a.next = &b;
18     b.next = &c;
19     c.next = NULL;
20     //到此为止,链表各节点已赋值完毕
21     p=head;//这个指针是操作需要
22     do 
23     {
24         printf("%ld%5.1f\n",p->num,p->score);
25         p = p->next;
26     } while (p!=NULL);
27     return 0;
28 }

静态链表挺简单的。下面说一下动态链表。
动态链表是要从无到有的一个个开辟节点。需要复习下动态分配内存的知识点。

全局变量分配在【静态存储区】,局部变量分配在【动态存储区】(称之为栈区)。

【自由存储区】【也是动态存储区】(称之为堆区),用于存放临时数据,不必声明为变量,随时开辟,不必随时释放。只能通过指针访问。

malloc函数原型 void * malloc(unsigned int size)  返回一个无类型的具体地址。(须使用stdlib.h头文件)

百科:sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。

int* 型指针只指向int类型变量,所以地址类型也需要转换。如以下代码注释。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define LEN sizeof(struct Student)
 4 struct Student
 5 {
 6     long num;
 7     float score;
 8     struct Student * next;
 9 };
10 int n = 0;
11 struct Student * creat()
12 {
13     struct Student * head;
14     struct Student *p1,*p2;
15     //(struct student *)是强制类型转换 将其首地址转换为结构体类型(因为malloc返回无类型的地址)
16     p1 = (struct Student *)malloc(LEN); 
17     scanf("%d%f",&p1->num,&p1->score);
18     while(p1->num!=0)
19     {
20         n++;
21         if (n==1)head = p1;
22         else p2->next = p1;
23         p2 = p1;
24         p1 = (struct Student *)malloc(LEN);
25         scanf("%d%f",&p1->num,&p1->score);
26     }
27     p2->next = NULL;
28     return head;
29 }
30 void print(struct Student * head)
31 {
32     struct Student * p;
33     p = head;
34     while (p!=NULL)
35     {
36         printf("%d,%5.1f\n",p->num,p->score);
37         p = p->next;
38     }    
39 }
40 void main()
41 {
42     print(creat());
43 }

 

静态链表和动态链表

标签:

原文地址:http://www.cnblogs.com/mengdejia/p/4332906.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!