1、在单链表中插入元素
头插法
这种每次都将数据插入单链表的头部(头指针后面)的插入法就叫头插法。
如果要把学生信息加入到单链表,可以这么写:
void addInfo(struct Info** students)//students是头指针
{
struct Info* info, *temp;
info = (struct Info*)malloc(sizeof(struct Info));
if (info == NULL)
{
printf("内存分配失败!\n");
exit(1);
}
getInput(info);
if (*students != NULL)
{
temp = *students;
*students = info;
info->next = temp;
}
else
{
*students = info;
info->next = NULL;
}
}
❝
由于students存放的是头指针,因此我们需要传入它的地址传递给函数,才能够改变它本身的值。而students本身又是一个指向Info结构体的指针,所以参数的类型应该就是struct Info**。
❞
往单链表里面添加一个结点,也就是先申请一个结点,然后判断链表是否为空。如果为空,那么直接将头指针指向它,然后next成员指向NULL。若不为空,那么先将next指向头指针原本指向的结点,然后将头指针指向新结点即可。
那么,打印链表也变得很简单:
void printStu(struct Info* students)
{
struct Info* info;
int count = 1;
info = students;
while (book != NULL)
{
printf("Student%d:\n", count);
printf("姓名:%s\n", info->name);
printf("学号:%d\n", info->identifier);
info = info->next;
count++;
}
}
想要读取单链表里面的数据,只需要迭代单链表中的每一个结点,直到next成员为NULL,即表示单链表的结束。
最后,当然还是别忘了释放空间:
void releaseStu(struct Info** students)
{
struct Info* temp;
while (*students != NULL)
{
temp = *students;
*students = (*students)->next;
free(temp);
}
}
尾插法
与头插法类似,尾插法就是把每一个数据都插入到链表的末尾。
void addInfo(struct Info** students)
{
struct Info* info, *temp;
info = (struct Info*)malloc(sizeof(struct Info));
if (info == NULL)
{
printf("内存分配失败!\n");
exit(1);
}
getInput(info);
if (*students != NULL)
{
temp = *students;
*students = info;
//定位到链表的末尾的位置
while (temp->next != NULL)
{
temp = temp->next;
}
//插入数据
temp->next = info;
info->next = temp;
}
else
{
*students = info;
info->next = NULL;
}
}
这么一来,程序执行的效率难免要降低很多,因为每次插入数据,都要先遍历一次链表。如果链表很长,那么对于插入数据来说就是一次灾难。不过,我们可以给程序添加一个指针,让它***都指向链表的尾部,这样一来,就可以用很少的空间换取很高的程序执行效率。
代码更改如下:
void addInfo(struct Info** students)
{
struct Info* info, *temp;
static struct Info* tail;//设置静态指针
info = (struct Info*)malloc(sizeof(struct Info));
if (info == NULL)
{
printf("内存分配失败!\n");
exit(1);
}
getInput(info);
if (*students != NULL)
{
tail->next = info;
info->next = NULL;
}
else
{
*students = info;
info->next = NULL;
}
}
|