链表有一个头指针变量head,它存放一个地址,该地址指向一个元素。链表中每一个元素都称为“节点”。每个节点都应包含两部分,一个用户需要用的实际数据和下一个节点的地址。head指向第一个节点,第一个元素又指向第二个节点,直到最后一个元素,该元素不再指向其他元素,它称为"表尾",它的地址存放的一个MULL的空地址,链表到此结束。
链表中各元素在内存中可以不是连续存放的,要找某一元素,必须先找到上一个元素,根据它提供的下一个元素的地址才能找到下一个元素,如果不同head指针,则整个链表都无法访问。
#include <stdio.h>
#define NULL 0
struct Student
{
long num;
int score;
struct Student* next;
};
int main(void)
{
struct Student a,b,c,*head,*p;
a.num=1;
a.score=100;
b.num=2;
b.score=99;
c.num=3;
c.score=94;
head=&a;
a.next=&b;
b.next=&c;
c.next=NULL;
p=head;
do
{
printf("%d,%d\n",p->num,p->score);
p=p->next;
} while (p!=NULL);
}
这是一个静态的链表,所有节点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。
处理动态链表所需的函数:
链表结构都是动态地分配存储的,即在需要时才开辟一个节点的存储单元,怎样动态的开辟和释放存储单元,有以下函数:
void * malloc(unsigned int n);
其作用是在内存的动态存储区中分配一个长度为n的连续空间,此函数的值即返回值是一个指向分配域起始地址的指针,类型为void。如果此函数未能成功执行,如内存不够,则返回NULL空指针。
void* calloc(unsigned n,unsigned size);
其作用是在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针。如果分配不成功,则返回NULL;用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。
void free(void* p);
其作用是释放由P指向的内存区,使这部分内存区能够被其他辩论赛还有。无返回值。
typedef的使用:使用typedef声明新的类型名来代替已有的类型名,用新类型去定义变量。
typedef stuct
{
int month;
int day;
int year;
}DATE;
DATE birthday;
DATE* p;还可以进一步:
typedef int NUM[100] 声明NUM为整形数组类型
NUM n;定义N为整形数组变量。
typedef int (*POINTER)() 声明POINTER为指向函数的指针类型,该函数返回整形值
POINTER p1,p2 p1 p2为POINTER类型的指针变量
#define putchar(C) fputc(c,stdout)