(c语言描述)使用单链表构建有序数组,以及单链表的插入与删除

文章介绍了单链表在处理动态数据时的优势,如在插入和删除元素时能有效降低时间复杂度,避免了像数组那样移动元素的开销。文中提供了C语言实现的单链表插入和删除函数,展示了如何通过调整指针来修改链表结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单链表的优势:

在构建有序数组时,直接使用传统的方法会导致程序运行效率不高(插入新的变量时,往后的所有数字都需要依次向后移动),而使用链表就可以只修改指针的指向而不用移动元素位置,时间复杂度大大降低。

以下是单链表插入元素示意图:

单链表插入:

 void insertArray(struct Array **head,int value)
{
    struct Array *news;//新插入的数字 
    struct Array *previous;//前向指针 
    struct Array *current;//后向指针 
    current = *head;//头指针指向后向指针 
    previous = NULL;//前向指针暂设为空,可以判断此链表是否为空链表 
    /*判断插入位置,移动前向指针与后向指针*/
    while(current!=NULL&&current->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&&current->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&&current->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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值