单链表的优势:
在构建有序数组时,直接使用传统的方法会导致程序运行效率不高(插入新的变量时,往后的所有数字都需要依次向后移动),而使用链表就可以只修改指针的指向而不用移动元素位置,时间复杂度大大降低。
以下是单链表插入元素示意图:
单链表插入:
void insertArray(struct Array **head,int value)
{
struct Array *news;//新插入的数字
struct Array *previous;//前向指针
struct Array *current;//后向指针
current = *head;//头指针指向后向指针
previous = NULL;//前向指针暂设为空,可以判断此链表是否为空链表
/*判断插入位置,移动前向指针与后向指针*/
while(current!=NULL&¤t->value<value)
{
previous = current;
current = current->next;
}
news = (struct Array *)malloc(sizeof(struct Array));//申请内存空间
if(news==NULL)//判断是否有空余内存(一般都有)
{
printf("内存分配失败!\n");
exit(1);
}
news->value = value;//将指针指向将要插入的数字
news->next = current;//首先改变后向指针(如果首先改变previous将导致指针丢失)
/*判断是否为空链表*/
if(previous==NULL)
{
*head = news;//如果是空链表,则直接插入
}
else
{
previous->next = news;//如果不是则将前向指针指向news指针
}
}
单链表删除:
void deletArray(struct Array **head,int value)
{
struct Array *current;//要删除的元素指针
struct Array *previous=NULL;//要删除元素的前一个元素,初始值设为空
current = *head;//将头指针赋值给current
while(current!=NULL&¤t->value!=value)//依次查找链表,current指向的就是要找的元素
{
previous = current;
current = current->next;
}
if(current==NULL)
{
printf("未找到该元素!\n");
return ;
}
else
{
if(previous==NULL)//previous指针未移动,表明current指向的是第一个元素
{
*head = current->next;//current直接指回头指针
}
else
{
previous->next = current->next;//前一个指针跨过current,直接指向current的下一个元素
}
free(current);//释放current
}
}
总的代码实现如下:
#include <stdio.h>
#include <stdlib.h>
/*定义结构体变量*/
struct Array
{
int value;
struct Array *next;
};
/*按序插入数字*/
/*(**head)是二级指针,在头指针需要更改的时候必须定义二级指针*/
void insertArray(struct Array **head,int value)
{
struct Array *news;//新插入的数字
struct Array *previous;//前向指针
struct Array *current;//后向指针
current = *head;//头指针指向后向指针
previous = NULL;//前向指针暂设为空,可以判断此链表是否为空链表
/*判断插入位置,移动前向指针与后向指针*/
while(current!=NULL&¤t->value<value)
{
previous = current;
current = current->next;
}
news = (struct Array *)malloc(sizeof(struct Array));//申请内存空间
if(news==NULL)//判断是否有空余内存(一般都有)
{
printf("内存分配失败!\n");
exit(1);
}
news->value = value;//将指针指向将要插入的数字
news->next = current;//首先改变后向指针(如果首先改变previous将导致指针丢失)
/*判断是否为空链表*/
if(previous==NULL)
{
*head = news;//如果是空链表,则直接插入
}
else
{
previous->next = news;//如果不是则将前向指针指向news指针
}
}
/*打印函数(全部打印)*/
void printArray(struct Array *head)
{
struct Array *current;//头指针不能变,因此再申请一个指针
current = head;//将头指针赋值给current
while(current!=NULL)//判断current是否指向空,不是则循环打印value
{
printf("%d ",current->value);
current = current->next;
}
putchar('\n');
}
int main()
{
struct Array *head = NULL;//定义一个结构体指针(头指针)
int input;
while(1)
{
printf("请输入一个整数(输入-1表示结束):");
scanf("%d",&input);
if(input==-1)
{
break;
}
insertArray(&head,input);//传入头指针的地址
printArray(head);
}
return 0;
}