链表
链表是一种数据类型,用于存储同种类型的批量数据。
数组的缺点:
- 静态分配:需要定义,编译时分配空间,程序执行时不能改变该存储区的大小。
- 必须占用连续的存储空间。
链表按需求动态分配存储空间:
- 使用C语言提供的标准函数malloc
- 掌握一个便准函数的用法,需要做到以下3点:
- 记忆函数名并明确函数功能。
- 形参的个数及类型
- 函数是否有值,值的类型与含义
malloc的功能:动态分配一个存储单元,形参一个无符号整数,决定存储单元所占据的字节数,函数返回类型位void*,值为该单元的地址。
例如:malloc(4)
1000 1 2 3
该单元是动态生成的,应通过指针间接访问。
int *p;
p=(int*)malloc(4);
p=(int *)malloc(sizeof(int));
*p表示当前所指向的单元,但单元的大小是有P的基类型决定的。
- sizeof()是C语言中的一个运算符。
- 运算量放在小括号中,可以是类型名,变量名和常量。
- 其值为该类型的量在内存中所占的字节数。
- p++是,越过一个单元,单元的大小依然由p的基类型决定
- 键盘输入一串字符,以回车结束,适用与字符个数相同的存储单元将其存放起来。
while((ch=getchar())!=’n’)
{
malloc(1);
}
char *p;
while((ch=getchar())!=’n’)
{
p=(char *)malloc(1);
*p=ch;
}
若键盘输入abcd回车
abc将无法被表示
一个存储单元被分成两个部分,每部分存储的数据类型还是不同的
链表中节点类型的定义:
struct node
{
char data;
struct node *naxt;
}
若键盘输入abcd回车
char *p;
while((ch=getchar())!=’n’)
{
p=(char *p)malloc(1);
*p=ch;
}
struct node *p;
while((ch=getchar())!=’n’)
{
P=(struct node *)malloc(sizeof(struct node));
- >data=ch;
}
程序中用到malloc()时,要包含stdlib.h
#include#include typedef struct node { char data; //代表数据域 struct node *next; //代表指针域,指向直接后继元素 }Node, *LinkList; //LinkList被声明为Node的指针,是指向下一个结点的后继指针 LinkList create() { LinkList h,r,s; char ch; h=(LinkList)malloc(sizeof(Node)); //创建首原结点,并初始化 r=h; //头指针指向首原结点 while((ch=getchar())!='n') { s=(LinkList)malloc(sizeof(Node)); //创建第一个新结点并初始化 s->data=ch; r->next=s; r=s; //建立新结点与直接前驱结点的逻辑关系 } r->next=0; return h; //返回建立的结点,返回头指针h即可通过头指针找到整个链表 } int main() { LinkList head,p; head=create(); p=head->next; while(p) { printf("%c",p->data); p=p->next; } }



