很久没有敲代码啦,因为今年疫情的原因,想想差不多一个月没有敲代码了,真是罪过,因为一直不知道北京会以什么样子的形式来进行复试,弄毕设弄的也狗屁不是的,我真他娘的讨厌小组合作,算了说多了也都是泪,代码还是得每天继续敲下去,管他呢,不多管闲事啦,毕设组长也不是我,我不要瞎操心啦,随便吧大家,还是自己的事情比较重要,明天我要早起敲代码,哼,加快脚步,初步打算之前的基础知识再来一遍然后再从王道和LeetCode牛客网上刷点题。今天群里说一个大佬一月份到现在没有停过,我是2月份到现在停了一个月,而且那个人也是计算机技术的,生活就是这样你不努力总会有人把你超越`。下面是一些基础的链表题目
//这是目前所想到的一些链表的题目,从今天开始一刻我也不会浪费了
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Lnode{
Elemtype data;
struct Lnode*next;
}Lnode,*LinkList;
//以上是结构体的基本定义
LinkList Creat(LinkList &L)
{
Elemtype e;
L=(Lnode*)malloc(sizeof(Lnode));
L->next=NULL;//不要忘记重要
scanf("%d",&e);
while(e!=9999)
{
LinkList s=(Lnode*)malloc(sizeof(Lnode));
s->data=e;
s->next=L->next;
L->next=s;
scanf("%d",&e);
}
return L;
}
//以上是头插法建立链表,头插法建立链表一定注意L->next=NULL头结点的初始化!
LinkList tail_insert(LinkList &L)
{
Elemtype e;
scanf("%d",&e);
LinkList r,s;
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;//尾插法可以没有这句
r=L;
while(e!=9999)
{
s=(Lnode*)malloc(sizeof(Lnode));
s->data=e;
r->next=s;
r=s;
scanf("%d",&e);
}
r->next=NULL;//不要忘记!!
return L;
}
//尾插法就是最后一定不要忘记将r->next=NULL
void print(LinkList L)
{
LinkList q;
q=L->next;
while(q!=NULL)
{
printf("%2d",q->data);
q=q->next;
}
printf("\n");
}
//输出链表一定先将L->next给令一个函数
LinkList number_find(LinkList L,int i)
{
LinkList q;
q=L->next;
int k=1;
if(i<=0)
{
printf("输入元素位置有误");
return NULL;
}
while(q!=NULL&&k<i)
{
q=q->next;
k++;
}
return q;
}
//按照位置查找元素,所有跟位置有关的函数都要调用他
LinkList elem_find(LinkList L,Elemtype e)
{
LinkList q=L->next;
while(q!=NULL&&q->data!=e)
{
q=q->next;
}
return p;
}
//按照元素来查找
bool Delte(LinkList &L,int i)
{ int k=1;
if(i==0)
{
return false;
}
LinkList q=L->next;
while(q!=NULL&&k<i-1)
{
q=q->next;
k++;
}
printf("%d",i);
LinkList r;
r=q->next;
q->next=r->next;
free(r);
return true;
}
//按照位置来进行删除元素
LinkList Delte_min(LinkList &L)
{
LinkList min,p;
p=L->next;
min=p;
while(p!=NULL)
{
if(p->data<min->data)
{
min=p;
}
p=p->next;
}
printf("%d",min->data);
return L;
}
//查找链表中最小元素
LinkList Reverse(LinkList &L)
{ LinkList s,r;
LinkList q=L->next;
L->next=NULL;
s=q->next;
r=NULL;
while(s!=NULL)
{
q->next=r;
r=q;
q=s;
s=s->next;
}
q->next=r;
L->next=q;
return L;
}
//链表的逆置,脑子中一定要有逆置的图
//在某个位置插入某个元素
LinkList insert(LinkList &L,int i,Elemtype e)
{ LinkList s=number_find(L,i-1);
LinkList q=(Lnode*)malloc(sizeof(Lnode));
q->data=e;
q->next=s->next;
s->next=q;
return L;
}
//删除某两个元素之间的元素
LinkList Delete_2(LinkList &L)
{
LinkList pre=L;
LinkList q=pre->next;
LinkList s;
Elemtype m,n;
printf("请输入想要删除数字范围,用,进行分割");
scanf("%d,%d",&m,&n);
if(m>n)
{
printf("输入的范围有误,请重新输入");
scanf("%d,%d",&m,&n);
}
else{
while(q!=NULL)
{
if(q->data>=m&&q->data<=n)
{
s=q;
q=q->next;
pre->next=q;
free(s);
}
else{
pre=q;
q=q->next;
}
}
}
return L;
}
//按照元素的值来删除元素
LinkList Delete_3(LinkList &L,Elemtype e)
{ LinkList pre=L;
LinkList q=pre->next;
if(q==NULL)
{
return q;
}
while(q!=NULL)
{
if(q->data!=e)
{
pre=q;
q=q->next;
}else{
LinkList s=q;
q=q->next;
pre->next=q;
free(s);
}
}
return L;
}
int main(){
LinkList L;
Elemtype n,e;
LinkList s;
bool flag;
printf("请开始输入元素,并且以9999作为结束标志");
//Creat(L);
tail_insert(L);
print(L);
Reverse(L);
print(L);
insert(L,3,9);
print(L);
Delete_2(L);
print(L);
Delete_3(L,2);
print(L);
flag=Delte(L,4);
if(flag)
{
printf("删除元素成功");
}else{
printf("删除元素失败");
}
print(L);
Delte_min(L);
printf("请输入要查找第几个位置");
scanf("%d",&n);
s=number_find(L,n);
if(s!=NULL)
{
printf("查找成功!%3d",s->data);
printf("\n");
}else
{
printf("查找失败");
}
printf("请输入你想要找的元素");
scanf("%d",&e);
s=elem_find(L,e);
if(s)
{
printf("查找元素成功\n");
}else{
printf("查找元素失败\n");
}
return 0;
}