单链表的操作(一)链表的原理与程序
单链表的结构组成
- 链表是一系列有结构体类型结点组成,每个结点都是由结构体数据成员和地址成员两部分构成。
- 数据成员部分称为数据域,用于存放结点数据;地址成员部分作为指针域,用于存放指向下一个结构体类型结点的地址指针
- 访问链表结构各结点的数据,需要从链表的head头指针开始查找。后续结点的地址,可由当前结点的地址域给出。
程序运行是,无论访问链表中的哪一个结点,都要从链表头开始,顺序向后查询,链表的尾结点,指针域设为NULL空值
静态单链表的创建与打印
/*L11_6.C*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
{
long int number;
char name[20];
float score;
struct student *next; /*定义结构体成员指针*/
};
int main()
{
struct student st1,st2,st3,*head;
head =&st1;
st1.next=&st2;
st2.next=&st3;
st3.next=NULL;
st1.number=201501;strcpy(st1.name,”zzf”);st1.score=100;
st1.number=201502;strcpy(st1.name,”zyy”);st1.score=80;
st1.number=201503;strcpy(st1.name,”cxy”);st1.score=87;
while(head == NULL)/*访问链表为非空时输出当前结点的值*/
{
printf(“学号:%ld,姓名:%s,成绩:%5.2f\n”,head->number,head->name,head->score);
Head=head->next;/*指向下一个结点*/
}
}
动态链表的创建与引用
利用以下函数创建和释放链表结点,可实现动态链表结构的应用
1、malloc()函数
malloc()函数用于申请分配单个结构体变量的内存空间。
用以存放一个结构体类型变量的数据,同时使结构体指针P,指向该结构体变量存储空间的起始地址。
malloc()函数原型定义为void类型,一般在使用是用强制类型转换将其转换为所需类型。如
p=(struct student*)malloc(sizeof(struct student));
2、calloc()函数
calloc()函数用于申请分配一组结构体变量内存空间。
例如
使用calloc()函数申请分配长度为12个结构体变量组成的一维结构体数组内存空间,并使结构体指针ps指向分配成功的内存空间起始地 址
struct student *ps;
ps = (struct student*)calloc(12,sizeof(struct student));
3、free()函数
free()函数用于释放指针变量指向占用的内存空间。
例如,要释放
ps = (struct student*)calloc(12,sizeof(struct student));
命令执行后,指针变量ps指向的占用内存区域,可执行
free(*ps);
将释放ps指向的一维结构体数组所占用的内存空间。
单向动态链表的创建与引用
创建动态链表的过程,就是按已定义的结构体类型,逐个开辟内存空间,创建
结点,输入数据并建立结点之间的链接,形成链表结构。
1、建立单向链表
例如,有许多学生数据需要输入,需建立多个学生结点的动态链表。
步骤如下:
- 定义链表数据结构
- 使用malloc(sizeof(结构体类型))开辟结点;
- 输入该节点数据,将该节点指针域成员赋为NULL值;
- 设置循环控制链表结点个数,只要输入数据有效就视为新结点;
- 判断新结点是否第一个结点,若是将head指向该节点,作为链表的表头;
- 若新结点不是第一个结点,将新结点接到表尾,将指针域赋为NULL值;
- 再用malloc(sizeof(结构体类型))函数开辟下一个结点;
依次循环直到结点数据输入结束,链表结构则创建完成。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*定义链表结构内容*/
struct list
{
char name[10];
long int number;
struct list *next;
};
/*创建链表插入函数,函数返回类型也必须是结构体指针(*head) */
struct list *insert(struct list *p)
{
int n=1;
struct list *p1,*p2,*head;
head = p;
/*指向结构体的指针必须先初始化,才能赋值,否则出现段错误*/
p1=p2=(struct list*)malloc(sizeof(struct list));
printf("please input the %d th name : number : \n",n++);
scanf("%s%ld",p1->name,&p1->number);
p1->next =NULL;
while((p1->number)>0) /*新建结点,p1,p2指向新结点,往新结点写入数据,若数据有效则再新建结点,让p1重新指向新建的结点,p2=p1 */
{
if(head ==NULL) head = p1;
else p2->next=p1;
p2= p1;
p1=(struct list*)malloc(sizeof(struct list));
printf("please input the %dth name : number : \n",n++);
scanf("%s%ld",p1->name,&p1->number);
p1->next = NULL;
}
free(p1);
return head;
}
/*輸出链表中的内容*/
void putout(struct list *head)
{
while(head!=NULL)
{
printf("name:%s\t number:%ld\n",head->name,head->number);
head = head->next;
}
}
int main()
{
struct list *head;
head=NULL;
head=insert(head);
putout(head);
return 0;
}
上一篇: 浅析php如何实现App常用的秒发功能
下一篇: C语言编程之求字符串长度
推荐阅读
-
单链表的操作(一)链表的原理与程序
-
数据结构与算法学习笔记(11):图解数据结构与算法-链表(一)&(二)&(三):单链表的概念与结构
-
【Oracle】-【创建索引】-创建索引的操作原理与一些体会
-
设计一个尽可能高效的算法求A和B的交集,要求不破坏A、B的结点,将交集存放在单链表C中
-
已知链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A与B的交集,并存放于A链表中。
-
单链表的九种基本操作(2021.5)
-
已知两个单链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A和B的交集,并存放于A链表中。
-
逆置一个单链表的三种方法
-
C语言编程实现:二叉树采用二叉链表存储,要求建立一颗二叉树,并输出要求的二叉树树状形式与结点编号。
-
快慢指针原理--快速找到未知长度单链表的中间节点