链表
链表是一种数据类型,用于存储同种类型的批量数据。
数组的缺点:
- 静态分配:需要定义,编译时分配空间,程序执行时不能改变该存储区的大小。
- 必须占用连续的存储空间。
链表按需求动态分配存储空间:
- 使用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<stdio.h>
#include<stdlib.h>
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;
}
}