标签:
数据库和数据结构都要用到链表。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