链表的基本操作

       今天,我们来了解链表的一些基本操作。

准备

       首先,我们先写入头文件,#include<stdio.h>(输入输出库 )   #include<stdlib.h>(标准库)。

int main(){
	printf("链表的基本操作\n");
	printf("==101:添加元素\n");
	printf("==201:打印链表数据\n");
	printf("==301:删除元素\n");
	printf("==401:指定位置插入一个元素\n");
	printf("==501:查找一个元素是否存在\n");
	printf("==601:根据位置查找一个元素\n");
	printf("==701:清空链表\n");
	printf("==999:退出系统\n"); 
}
	

然后,在main函数中,写入链表的一些基本功能,添加元素,删除元素,指定位置插入元素,查找元素,以及清空链表。

struct Node{
	int data;
	struct Node *next;
};

Node* createNode(int data){
    Node *newNode=(Node*)malloc(sizeof(Node));
    if(newNode==NULL){
    	return NULL;
	}
	newNode->data=data;
	newNode->next=NULL;
	return newNode;

然后再进行节点结构体的创建,其中data用来存储数据,Node *next则是用来存储本身的指针变量。

Node *head=NULL;
	int cid=0;

       接下来我们就可以在main函数中明头节点,并第一时间指向空 ,记住头节点必须维护。

然后我们就可以进行函数的编写

打印链表的循环
void  printLinkedList(Node *head){
	printf("链表:[");
	if(head==NULL) {//
		printf("]\n");//
		return;//
	}//
    
	Node *temp = head;
	while(temp->next!=NULL){
	    printf("%d->",temp->data);
		temp=temp->next;
	}
	printf("%d]\n",temp->data);
}

首先,我们要先写好打印链表的代码,让后续的代码编写可以运行查看,其中,我们要考虑到链表为空的情况,不然,会在打印时卡住

添加元素

然后是添加元素

Node* add(int data,Node *head){
	Node *newNode=createNode(data); 
    if(newNode==NULL){
    	printf("创建失败,内存分配失败\n");
    	return head;
	} 
	if(head==NULL){
	return newNode;
	}
	Node *temp=head;
	while(temp->next!=NULL){
		temp=temp->next;
	}

    temp->next=newNode;
    return head;
}

       首先创建新的节点,将data存储进去,在循环结束时,temp为最后一个节点,将新节点加载到该节点的next中,其中,我们要注意到头节点为空以及内存分配失败,即内存不足的情况,还有一点,必须返回,因为前面写了返回值类型 。在写好后,就可以将该功能放入main函数中。

       我们要知道,如果想让它一直保持运行,那我们就需要定义一个 while 循环,然后让循环可以一直运行,如果用 true 和 false 得导布尔值的类。

if(cid==101){
		printf("101--请输入一个数字:\n");
		int data=0;
		scanf("%d",&data);
		head= add(data,head);

效果如图

查找元素

然后是查找元素,我们这里是输入元素,输出它的下标,下表是从0开始。

int getByE(int v,Node *head){
	if(head==NULL){
		printf("链表为空,不存在任何数据\n");
		return -1 ;
	}
	int index=0; 
	int f=-1;
	 
	Node *temp = head;
	while(temp->next!=NULL){
		if(temp->data==v){
			f=1;
			break;
		} 
	    
		temp=temp->next;
		index++;
		
    }
    if(f==1){
    return index;
}else{
	return f;
}

       首先我们要考虑到头节点为空,即链表为空的情况,用if进行检验,然后,我们可以使用f检查是否有节点的数据与参数数据相同,没有就保持为-1 。有就返回下标,没有就返回-1。然后,我们就可以把它放入main函数中。

else if(cid==501){
			printf("501查找元素位置--请输入一个数字:\n");
			int data=0;
			
			scanf("%d",&data) ;
			int index=getByE(data,head); 
			if(index==-1){
				printf("数据不存在\n");
				
			}else{
					printf("%d在链表中的位置:%d\n",data,index);
			}

效果如图:

清空数组

接下来就是清空数组

void freeList(Node *head){
	Node *curr=head;
	while(curr!=NULL){
		Node *temp=curr;
		curr=curr->next;
		free(temp);
	}
}

在清空数组中的元素后,一定要释放之前分配的内存,不然可能会发生内存泄漏。

else if(cid==701){
		printf("701清空数组\n");
		freeList(head);
		head =NULL; 
		printf("清空成功,内存释放\n");
	} 

我们再把它放入main函数中,这样就完成了清空数组功能的设计

插入元素

最后就是在指定位置后插入一个元素,这是比较难的一步,我们先要找到那个位置,将那里的数据换为要插入的数据,再将后面的数据往后移。

Node* insert(int data,Node *head){
	Node *newNode=createNode(data);
    if(newNode==NULL){
    	printf("创建失败,内存分配失败\n");
    	return head;
	} 
	if(head==NULL){
	return newNode;
	}
	int count=0;
	Node *temp=head;
	while(temp->next!=NULL){
		if(count==index){
			newNode->next =temp->next;
			temp->next=newNode;
			break;
		}
		temp=temp->next;
		count++;
	}
	if(count==index){
	
	temp->next=newNode;
}else{
	printf("输入的位置不存在\n");
}
    return head;
}

重点就是,将当前节点所存储的next存入新节点的下一个 ,再将当前节点的next 存储自己 

else if(cid==401){
			printf("401:指定位置后插入一个元素,请输入一个数字和一个位置:\n");
			int data=0;
			int index; 
			scanf("%d%d",&data,&index);
			head=insert(index,data,head);
	
}
	

最后将其放入main函数中,head中要传入下标,数据,以及头节点。最后运行一下:

Logo

分享最新、最前沿的AI大模型技术,吸纳国内前几批AI大模型开发者

更多推荐