1.链表是由借点构成的,关键是定义结点;
2.链表的结点定义打破了先定义再使用的限制,即乐意用自己定义自己(递归函数的定义也违反了先定义后使用)
3.对链表的基本操作:
创建链表
检索操作
插入操作
删除操作
4.一个指针类型的成员可以指向其他类型结构的结构体数据,也可以指向自己所在的结构体类型的数据
每个结点中的next即使自己的一个成员,还指向下一个结点的数据,即它是下一个结点内容的地址
#include<stdio.h>
struct student
{
long num;
float score;
struct student *next;
};
#define NULL 0
int main(void)
{
struct student a,b,c,*head,*p;
a.num=99101;//在这里会发现:就是a后面是
a.score=89.5;
b.num=99103;
b.score=90;
c.num=99107;
c.score=85;
head=&a;
a.next=&b;
b.next=&c;
c.next=NULL;
p=head;
do
{
printf("%5.1f%5.1f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
return 0;
}
6. void *malloc(unsigned int size)返回值是一个指向分配域起始地址的指针,基本返回型是vois
void *calloc(unsigned n,unsigned size)在内存动态区中分配n个长度为size的连续空间,返回值指向分配域起始地址的指针,失败返回NULL
主要用途是为以为数组开辟动态存储空间,n为数组元素个数,每个元素长为size
void free(void *p)作用:释放由p指向的内存区。P:是最近一次调用calloc或malloc函数时返回的值,这个函数是没有返回值的,动态分配的存储单元在用完后一定要释放,否则内存会因为申请空间过多引起资源不足而出现故障
#include<stdio.h>
void func(char **t)//*t为字符串地址,要将字符串的值初始化开辟的空间**t=*p;*t指向p的地址
{
//int i;
//char s[]="hello";
//char *p=t;
*t=(char*)malloc(sizeof(char)*10);//这函数用的是二级指针,先将地址赋值,然后将内容写进地址
strcpy(*t,"hello");
puts(*t);//puts()本身就用的是指向字符串的指针
// for(i=0;i<sizeof(char)*10;i++)
// {
// memset(s[i],*(t+i),i);
// }
}
int main(void)
{
char *p="he";
func(&p);//这里传递的应该是地址
puts(p);
//int* p= (int *)malloc(sizeof(int)*10);//开辟了一个数组的空间
//*p=6;//存值
//printf("*p=%d",*p);
//memset(p,0,sizeof(int)*10);//清空内存为0
// puts(p);
return 0;
}
7.。。。。。的用法
#include <stdio.h>
#include <stdlib.h>
#include<stdarg.h>
void abc(int n,...)
{
va_list list;//首先声明一个list
va_start(list,n);//从n这个参数就是diyige
printf("%c\n",va_arg(list,int));//传递的是int类型,输出的是字符
printf("%f\n",va_arg(list,double));
printf("%d\n",va_arg(list,int));
va_end(list);
}
int main(void)
{
abc(1,'c',3.5,4,5,6,7,8);
return 0;
}