我们学数据结构第一个例子就是链表,它可以实现理论上的连续,而物理上的非连续的效果,节省空间的同时也方便插入,下面来介绍三种插入方法
1.头插法
void head_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;
*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;
}
}
}
总结:
要改变主调函数中的值 ,必须要穿的函数变量
的地址!