单向链表的创建及其简单功能的实现
Posted LMM1314521
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单向链表的创建及其简单功能的实现相关的知识,希望对你有一定的参考价值。
目录
1.链表的创建
#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct linklist
{
int a;
struct linklist*next;
}link;
link* header()
{
link *p=malloc(sizeof(link));
p->a=1;
p->next=NULL;
int val=0;
//创建尾部指针
link* end=p;
printf("请输入你的数据(以-1代表输入结束):\\n");
while(true)
{
scanf("%d",&val);
if(val!=-1)
{
link *linknext=malloc(sizeof(link));
linknext->a=val;
linknext->next=NULL;
end->next=linknext;
//更新尾部指针
end=linknext;
}
else
{
break;
}
}
return p;
}
链表的创建及其初始化
链表的创建为结构体 加指针指针的方式创建
链表的初始化则是通过对头节点的赋值来实现的
先创建一个头节点也就是link*p=malloc(sizeof(link))
然后创建指针变量指向头节点,然后随着节点的创建移动指针变量链表即创建完毕
2链表的插入
//在原来数字后插入一个值
void oldlink(link* header)
{
int olddate,newdate;
//创建两个节点
link*current=header;
printf("是否要插入尾部:\\n");
printf("0代表插入,1则不插入\\n");
int b;
scanf("%d",&b);
if (b==1)
{
printf("原来的数字为:\\n");
scanf("%d",&olddate);
printf("要插入的数字为:\\n");
scanf("%d",&newdate);
link*newcurrent=current->next;
while(current->a!=olddate)
{
current=newcurrent;
newcurrent=current->next;
}
if(newcurrent==NULL)
{
printf("未找到目标值,插入失败\\n");
}
else
{
link*new=malloc(sizeof(link));
new->a=newdate;
current->next=new;
new->next=newcurrent;
printf("插入成功\\n");
}
}
//直接插入尾部
else if(b==0)
{
printf("要插入的数字为:\\n");
scanf("%d",&newdate);
link*lin=header;
while(lin->next!=NULL)
{
lin=lin->next;
}
link*new=malloc(sizeof(link));
new->a=newdate;
new->next=NULL;
lin->next=new;
printf("插入成功\\n");
printf("---------------\\n");
}
}
可以链表中插入值,得用双指针
需要更改前一个的next还需要拿到后一个的地址来存放到当前节点
注意:
借助while循环即可实现但插入不到最后(如果有更好的代码请评论一下我没有想到),还有链表中的数字不能重复否则无法实现,借助if可以认为判断一下
3.链表的遍历
void print (link* head)
{
link* p=head;
printf("你的数据为:\\n");
while(p->next!=NULL)
{
p=p->next;
printf("%d\\n",p->a);
}
}
4.链表的清空
void clearlink(link* header)
{
if(header==NULL)
{
return;
}
link*p=header;
while(p!=NULL)
{
link*lin=p->next;
free(p);
p=lin;
}
header->next=NULL;
}
//删除节点
需要借助一个新的指针变量来保存地址不然一旦free后便早不到后面的地址了,追后初始化NULL即可完成
5.链表的销毁
和链表的清空差不多,不过多free了一次
6.链表的指定值的删除
void cutlink(link* header)
{
int a;
printf("请输入要删除的数字:\\n");
scanf("%d",&a);
link*p=header;
link*oldheader=NULL;
//上一个节点
link *older=NULL;
while(p->a!=a)
{
oldheader=p;
p=p->next;
}
if(p->a==a&&p->next!=NULL)
{
oldheader->next=p->next;
printf("删除成功\\n");
printf("--------------\\n");
}
else if(p->a==a&&p->next==NULL)
{
oldheader->next=NULL;
printf("删除成功\\n");
printf("----------\\n");
}
else if(p->a!=a)
{
printf("未查询到该数字\\n");
printf("---------------\\n");
}
}
注意:不能完全删除的数字,只能删除第一个
7.完整的实现功能
.h
#ifndef _TEST_H_
#define _TEST_H_
typedef struct linklist
{
int a;
struct linklist*next;
}link;
//初始化链表
link* header();
//遍历链表
void print (link* header);
//在链表后加一个旧的值新的值
void oldlink(link* header);
//销毁链表
void dellink(link* header);
//清空链表
void clearlink(link* header);
//删除节点
void cutlink(link* header);
#endif
.c
#include"linklist.h"
#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//菜单
void menu()
{
printf("-----------------------------------\\n");
printf("1.输入数据、2输出数据\\n");
printf("3.插入数据、4删除数据\\n");
printf("5.清空数据\\n");
printf("(输入负数结束)\\n");
printf("-----------------------------------\\n");
}
//初始化链表
link* header()
{
link *p=malloc(sizeof(link));
p->a=1;
p->next=NULL;
int val=0;
//创建尾部指针
link* end=p;
printf("请输入你的数据(以-1代表输入结束):\\n");
while(true)
{
scanf("%d",&val);
if(val!=-1)
{
link *linknext=malloc(sizeof(link));
linknext->a=val;
linknext->next=NULL;
end->next=linknext;
//更新尾部指针
end=linknext;
}
else
{
break;
}
}
return p;
}
//遍历链表
void print (link* head)
{
link* p=head;
printf("你的数据为:\\n");
while(p->next!=NULL)
{
p=p->next;
printf("%d\\n",p->a);
}
};
//在原来数字后插入一个值
void oldlink(link* header)
{
int olddate,newdate;
//创建两个节点
link*current=header;
printf("是否要插入尾部:\\n");
printf("0代表插入,1则不插入\\n");
int b;
scanf("%d",&b);
if (b==1)
{
printf("原来的数字为:\\n");
scanf("%d",&olddate);
printf("要插入的数字为:\\n");
scanf("%d",&newdate);
link*newcurrent=current->next;
while(current->a!=olddate)
{
current=newcurrent;
newcurrent=current->next;
}
if(newcurrent==NULL)
{
printf("未找到目标值,插入失败\\n");
printf("---------------");
}
else
{
link*new=malloc(sizeof(link));
new->a=newdate;
current->next=new;
new->next=newcurrent;
printf("插入成功\\n");
printf("-------------");
}
}
//直接插入尾部
else if(b==0)
{
printf("要插入的数字为:\\n");
scanf("%d",&newdate);
link*lin=header;
while(lin->next!=NULL)
{
lin=lin->next;
}
link*new=malloc(sizeof(link));
new->a=newdate;
new->next=NULL;
lin->next=new;
printf("插入成功\\n");
printf("---------------\\n");
}
}
//销毁链表
void dellink(link* header)
{
}
//清空链表
void clearlink(link* header)
{
if(header==NULL)
{
return;
}
link*p=header;
while(p!=NULL)
{
link*lin=p->next;
free(p);
p=lin;
}
header->next=NULL;
}
//删除节点
void cutlink(link* header)
{
int a;
printf("请输入要删除的数字:\\n");
scanf("%d",&a);
link*p=header;
link*oldheader=NULL;
//上一个节点
link *older=NULL;
while(p->a!=a)
{
oldheader=p;
p=p->next;
}
if(p->a==a&&p->next!=NULL)
{
oldheader->next=p->next;
printf("删除成功\\n");
printf("--------------\\n");
}
else if(p->a==a&&p->next==NULL)
{
oldheader->next=NULL;
printf("删除成功\\n");
printf("----------\\n");
}
else if(p->a!=a)
{
printf("未查询到该数字\\n");
printf("---------------\\n");
}
}
int main()
{
menu();
int a=1;
link* p=NULL;
while(a>0)
{
scanf("%d",&a);
switch (a)
{
case 1:
p=header();
break;
case 2:
print(p);
break;
case 3:
oldlink(p);
break;
case 4:
cutlink(p);
break;
case 5:
clearlink(p);
break;
}
menu();
}
return 0;
}
以上是关于单向链表的创建及其简单功能的实现的主要内容,如果未能解决你的问题,请参考以下文章