我们先实现一个简单的单链表的可添加数据和打印数据
#include "stdio.h"
#include "stdlib.h" //提供malloc()和free()
#include "string.h" //提供strcpy()等
struct Node* head= NULL;
struct Node* end = NULL;
struct Node{
int a; //数据域
struct Node* next; //指针域(指向节点的指针)
};
//尾部添加
void add(int a )
{
//创建一个节点
struct Node* temp=(struct Node*)malloc(sizeof(struct Node)); //此处注意强制类型转换
//节点数据进行赋值
temp->a=a;
temp->next=NULL;
//连接分两种情况1.一个节点都没有2.已经有节点了,添加到尾巴上
if(NULL==head)
{
head=temp;
}
else{
//连续追加
end->next=temp;
}
end=temp; //尾结点应该始终指向最后一个
}
//打印所有
void print()
{
struct Node *temp =head; //定义一个临时变量来指向头
while (temp !=NULL)
{
printf("%d\n",temp->a);
temp = temp->next; //temp指向下一个的地址 即实现++操作
}
}
//运行
int main(){
add(1);
add(2);
print();
return 0;
}
接下来是完整的单链表所有功能演示,数据的头插入,尾插入,指定位置插入,和数据的头删除,尾删除,指定位置删除,和打印数据。
#include "stdio.h"
#include "stdlib.h" //提供malloc()和free()
#include "string.h" //提供strcpy()等
struct Node* head= NULL;
struct Node* end = NULL;
struct Node{
int a; //数据域
struct Node* next; //指针域(指向节点的指针)
};
//尾部添加
void add(int a )
{
//创建一个节点
struct Node* temp=(struct Node*)malloc(sizeof(struct Node)); //此处注意强制类型转换
//节点数据进行赋值
temp->a=a;
temp->next=NULL;
//连接分两种情况1.一个节点都没有2.已经有节点了,添加到尾巴上
if(NULL==head)
{
head=temp;
}
else{
//连续追加
end->next=temp;
}
end=temp; //尾结点应该始终指向最后一个
}
//打印所有
void print()
{
struct Node *temp =head; //定义一个临时变量来指向头
while (temp !=NULL)
{
printf("%d\n",temp->a);
temp = temp->next; //temp指向下一个的地址 即实现++操作
}
}
//删除开头
void topdell(){
if(NULL == head){
printf("空");
return ;
}else{
head=head->next;
}}
//删除结尾
void dell(){
if(NULL == end){
printf("空");
return ;
}else{
//地址相同
struct Node* temp = head;
struct Node* temp2;
while(1){
if(temp->next==NULL){
//释放最后一个
free(temp);
//上一个指向空
temp2->next=NULL;
//end被重新定义新的结尾
end=temp2;
break; }
//记住上一个指针
temp2=temp;
//指向下一个
temp=temp->next;
}}
}
//删除任意位置
void maxdell(int number){
int key=0;
if(head == end){
printf("空");
return ;
}else{
//地址相同
struct Node* temp = head;
struct Node* temp2;
while(1){
if(number==1){
topdell();
return;
}
key++;
if(key==number){
//间隔一位
temp2->next=temp->next;
//释放去掉的空间
//free(temp2);
break; }
//记住上一个指针
temp2=temp;
//指向下一个
temp=temp->next;
//超过最大时退出
if (temp->next==NULL ){
printf("不合法删除\n");
break;
}
}}
}
//开头添加
void topadd(int a )
{
if(head==NULL){
add(a);
return;
}
//写好新的
struct Node* temp2=(struct Node*)malloc(sizeof(struct Node)); //此处注意强制类型转换
temp2->a=a;
temp2->next=head;
head=temp2;
}
//任意位置添加
void maxadd(int number,int data){
int key=0;
if(head == end){
printf("空");
return ;
}else{
//地址相同
struct Node* temp = head;
struct Node* temp2;
while(1){
if(number==1){
topadd(data);
return;
}
key++;
if(key==number){
//写好新的
struct Node* temp3=(struct Node*)malloc(sizeof(struct Node)); //此处注意强制类型转换
temp3->a=data;
//拼接
temp3->next=temp;
temp2->next =temp3;
break; }
//记住上一个指针
temp2=temp;
//指向下一个
temp=temp->next;
//超过最大时退出
if (temp->next==NULL ){
printf("不合法添加\n");
break;
}
}}
}
int main(int argc, char** argv){
//添加数据
add(5);
add(50);
add(55);
add(509);
//开头添加25
topadd(25);
//指定位置添加45
maxadd(3,45);
//删除开头
topdell();
//删除结尾
dell();
//指定位置删除
maxdell(2);
//打印全部
print();
return 0;
}
下面是我的几个联系方式:
我的b站视频作品首页:https://space.bilibili.com/650029439