链表的三种插入方法
程序员文章站
2022-07-16 13:19:37
...
我们学数据结构第一个例子就是链表,它可以实现理论上的连续,而物理上的非连续的效果,节省空间的同时也方便插入,下面来介绍三种插入方法
1.头插法
void head_insert(STU **head) {//需要改变指针的值,所以传**类型
//1.申请节点空间
STU *new_node = (STU*)malloc(sizeof(STU));
if (new_node == NULL) {//申请失败判断
perror("malloc");
}
memset(new_node, 0, sizeof(STU));//清空结构体
//2.给节点赋值
scanf("%d %s %f",&new_node->num,new_node->name,&new_node->score);
//3.对头(节点)进行判断
STU *pf=*head;
*head = new_node;//指针赋值
pf == NULL?(new_node->next = NULL):(new_node->next = pf);
}
2.尾插法
void tail_insert(STU **head) {
STU *new_node = (STU*)malloc(sizeof(STU));
if (new_node == NULL) {
perror("malloc");
}
memset(new_node, 0, sizeof(STU));
scanf("%d %s %f", &new_node->num, new_node->name, &new_node->score);
STU *pf = *head;
if(pf==NULL)
*head = new_node;
else {
while (pf->next != NULL) {
pf = pf->next;
}
pf->next= new_node;
}
}
3.顺序插法
此方法有一定难度,需要定义两个指针,也可以用一个指针的next的next来判断循环条件,再去对每个情况去判断
void sort_insert(STU **head) {
STU *new_node = (STU*)calloc(1,sizeof(STU)),*temp=NULL;
if (new_node == NULL) {
perror("calloc");
}
scanf("%d %s %f", &new_node->num, new_node->name, &new_node->score);
STU *pf = *head;
if (pf == NULL)
*head = new_node;
else {
while (pf != NULL) {
//按成绩的多少插入,大的在前
if (pf->score >= new_node->score ) {
temp = pf;//定义上一个节点的指针
pf = pf->next;
}
else {
break;
}
}
if (pf == *head ) {//在头部插入
*head = new_node;
new_node->next = pf;
}
else if (pf !=NULL) {//在中间插入
new_node->next = temp->next;
temp->next = new_node;
}
else {//在尾部插入
temp->next = new_node;
}
}
}
总结:
要改变主调函数中的值 ,必须要穿的函数变量
的地址!
上一篇: 期末考试复习(王宁)
下一篇: MessageBox()