用指针处理链表(面试经常测试点之一)
1.链表概述:
链表是一种重要的数据结构,它是动态地进行存储分配的一种结构。
链表的结构:头指针 结点 表尾。其中结点分为两个部分:1.为用户需要用的实际数据。2.为下一个结点的地址。表尾一般都用指向“NULL”表示链表结束。
2.简单链表:
a.搞清楚各个结点是怎样构成链表的。b.没有头指针 head行不行。
所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。
3.处理动态链表所需的函数:
a.malloc 函数 其原型为:void *malloc(unsigned int size); 作用是在内存的动态存储区中分配一个长度为size的连续空间。如果此函数未能成功地执行,则返回空指针。
b.calloc 函数 其原型为:void *calloc(unsigned n,unsigned size); 作用是在内存的动态区存储中分配n个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。用calloc函数可以为一维数组开辟动态内存空间,n为数组元素个数,每个元素长度都为size。
c.free 函数 其原型为:void free(void *p); 作用是释放有p指向的内存区,使这部分内存区能被其他变量使用。p是最近一次调用calloc或malloc函数时返回的值。free函数无返回值。
4.建立动态链表:
所谓建立动态链表是指在程序执行过程中从无到有地建立一个链表,即一个一个地开辟结点和输入各个结点数据,并建立起前后相链的关系。
5.输出链表:
将链表中各个结点的数据依次输出。首先要知道链表第一个结点的地址,也就是要知道head的值,然后设一个指针变量的P,先指向第一个结点,输出p所指的结点,然后使p后移一个结点,再输出。知道链表的尾结点。head的值由实参传过来,也就是将已有的链表的头指针传给被调用的函数。
6.对链表的删除操作:
从一个动态链表中删去一个结点,并不是真正从内存中把它抹掉,而是把它从链表中分离出来,只要撤消原来的链接关系即可。
7.对链表的插入操作:
对链表的插入是指将一个结点插入到一个已有的链表中。(只需要在插入结点处建立一个链接关系即可。)
8.对链表的综合操作:
1 #include<stdio.h>
2 main()
3 {
4 struct student *head,stu;
5 long del_num;
6 printf("input records:\n");
7 head=creat();
8 print(head);
9 printf("\ninput the deleted number:");
10 scanf("%ld",&del_num);
11 head=del(head,del_num);
12 print(head);
13 printf("\ninput the inserted record:");
14 scanf("%ld,%f",&stu.num,&stu.score);
15 head=insert(head,&stu);
16 print(head);
17 }