链表操作入门:从创建到清空
链表的基本操作
今天,我们来了解链表的一些基本操作。
准备
首先,我们先写入头文件,#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中要传入下标,数据,以及头节点。最后运行一下:
更多推荐


所有评论(0)