链表:
1)链表分类:
表头:只有指针域
节点:指针域+数据域 指针域指向下一节点数据域,指针域为下一节点的首地址 即ptemp->next=pnew
表尾:指针域+数据域 指针域指向为NUL
2)链表是链式存贮结构,在空间内不一定是连续的
理解两个代码段:(1)ptemp = ptemp->next //进行下一个节点操作
(2)ptemp->next = pnew; //当前节点指针域指向下一节点(当然也可以存放上一节点地址)
创建节点---创建链表---删除节点---插入节点----查询节点---修改节点
1.构造结构体
typedef struct student
{
int ID;
char name[10];
float score;
struct student *pnext
}STD;
2.创建节点
STD *Creat_node(void)
{
STD *pnew = (STD *)malloc(sizeof(STD));
pnew->pnext = NULL;
return pnew;
}
3.创建链表
STD *Creat_link(int num)
{
STD *phead;
STD *pnew,*pb;
phead = NULL;
for(int i = 0;i <= num;i++)
{
pnew = Creat_node();
if(i == 0 )
{
phead = pnew;
}
else
{
pb->pnext = pnew;
}
pb = pnew;
}
if(phead != NULL)
{
pb->pnext = NULL;
}
return phead;
}
4.删除节点
int Delete_node(STD *phead,int ID)
{
STD *ptemp = phead;
STD *pdelete = NULL;
if(phead == NULL)
{
perror("要查询的链表为空");
}
while(ptemp->pnext != NULL)
{
if(ptemp->pnext->id == ID)
{
pdelete = ptemp->pnext;
ptemp=>pnext = pdelete->pnext;
free(pdelete);
return 1;
}
ptemp = ptemp->pnext;
}
return 0;
}
5.插入节点
STD *Insert_node(STD *phead,STD *pnew)
{
STD *ptemp = phead;
if(ptemp == NULL)
{
perror("Insert 链表为空");
exit(0);
}
while(ptemp->pnext != NULL)
{
ptemp=ptemp->pnext;
}
ptemp->pnext = pnew;
return ptemp;
}
6.查询节点
STD *SEEK_node(STD *phead,int id)
{
STD *ptemp = phead;
STD *pseek = NULL;
while(ptemp->pnext != NULL)
{
if(ptemp->pnext->id == ID)
{
pseek = ptemp->pnext;
return pseek;
}
ptemp = ptemp->pnext;
}
return 0;
}
7.修改节点
int *Change_node(STD *phead,STD ptemp)
{
STD *pseek = SEEK_node(phead,ptemp.id);
pseek->id = std.id;
strcpy(pseek->name,std.name);
pseek->score = std.score;
return 1;
}
2).链表常用函数
(1) malloc
函数原型:void *_Cdecl malloc(size_t size);
函数功能:向存储器申请一块内存空间(手动开辟。从堆区开辟,只要我们不释放空间,保存的数据会一直存在,直到main结束自动释放空间为止)
使用:p = malloc(8); //向存储器申请一块大小为8个字节的空间,如果成功p里面保存的就是申请后的空间首地址
(2) calloc
函数原型:void *_Cdecl calloc(size_t nitems, size_t size);
函数功能:向存储器申请多块内存空间
使用:例:p = calloc(3,4); 成功:返回开辟的第一块空间的首地址失败返回NULL
(3) realloc
函数原型:void *_Cdecl realloc(void *block, size_t size);
函数功能:修改已经分配的内存空间大小
函数参数:block:表示需要修改的内存空间首地址 size:修改成多大的内存空间
函数返回值:成功:返回新空间的首地址 ,失败:NULL
例:p = realloc(q,20); //向存储器申请修改空间字节大小,改成20字节,然后把新空间的首地址赋值给p
注:如果原有空间有数据,新空间比原空间小时会发生数据丢失。
(4)free
函数原型:void _Cdecl free(void *block);
函数功能:手动释放向存储器动态开辟的空间
函数参数:要释放的空间首地址
函数返回值:无