我的创作纪念日

机缘

其实最早接触CSDN,就是在百度上搜索一些编程相关的问题,然后发现很多解答都是出自CSDN,然后才慢慢对CSDN有了一些了解,然后我就注册了自己的账号,后面在自己在学习编程的过程中,有一些不会的题或者不理解的知识点,我都会在CSDN上找相关的博客去学习。


收获

到现在为止,我写了52篇文章了,也收获了1000+的粉丝。


日常

有时候可能比较忙,没有太多的时间持续进行创作,有时候可能很久才会更新博客。但是,我们觉得我可以坚持下去,一旦有空闲时间,我一定会合理的分配给学习和创作。


成就

//单链表基本操纵的实现(包含头结点)
#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef int ElemType;
typedef int Status;//Status为函数类型,其值是函数结果状态代码,如OK等(状态代码:return OK插入成功,提高代码的可读性,我这里偷懒未使用)
//单链表的存储结构
typedef struct LNode
{
    ElemType data;          //结点的数据域
    struct LNode* next;     //结点的指针域(指向下一个结点)
}LNode,*LinkList;           //LNode为单链表的结点,LinkList为指向结点LNode的指针(LNode*与LinkList等价,这样使用是为了更好地区分链表与结点)

/*
作者理解(有误请大佬指出):
这是定义一个结构体,这个结构体有两个属性,
一个是ElemType类型的data;
另一个是这个结构体类型的指针next;
给这个结构定义了一个别名:LNode,一个指针的别名:LinkList;
LNode a; 等价于 struct node a;
都是声明一个struct node结构体类型的结构体变量 a;
LinkList b; 等价于 struct LNode *b;等价于 LNode *b;
但是为了提高代码的可读性,我们用LinkList声明链表eg:LinkList L
声明一个struct LNode结构体类型的指针变量 b(这个指针变量指向结点LNode);
重要:
LNode* p=L->next;//这是新建一个指针名叫p,它指向的是首元结点。
即:p代表首元结点的地址,*p就代表指向这个地址p,这里可理解为*p就是首元结点
*/

//单链表的初始化,这里的L为指向头结点的头指针
void InitList(LinkList &L)
{//构造一个空的单链表L
    L=new LNode;    //生成新的结点作为头结点,用头指针L指向头结点(这时候L就代表该单链表)
    L->next=NULL;   //头结点的指针域置空
}
//前插法创建单链表
void CreateList_H(LinkList &L,int n)
{//逆位序输入n个元素的值,建立带表头结点的单链表L
    for(int i=0;i<n;++i)
    {
        LNode* p=new LNode;//生成新结点指针p
        cout<<"请输入第"<<n-i<<"个元素:";
        cin>>p->data;
        //所有插入元素都插入到头结点之后
        p->next=L->next;
        L->next=p;
    }
}

//后插法创建单链表
void CreateList_R(LinkList &L,int n)
{
    LNode* r=L;//尾指针r指向头结点
    for(int i=0;i<n;++i)
    {
        LNode* p=new LNode;//生成新的结点
        cout<<"请输入第"<<i+1<<"个元素:";
        cin>>p->data;
        p->next=NULL;//将新结点的指针域置空
        r->next=p;//将新结点*p插入尾结点*r之后
        r=p;
    }
}

//单链表的取值
ElemType GetElem(LinkList L,int i)
{
    LNode* p=L->next;//初始化p使p指向首元结点
    int j=1;
    while(p&&j<i)
    {
        p=p->next;//p指向下一结点(例如:p指向第2个结点)
        ++j;//相应计数器加1(那么相应的j的计数就为2)
    }
    if(!p||j>i)
    {
        cout<<"i的值不合法!\n"<<endl;
        return ERROR;
    }
    return p->data;
}

//单链表的按值查找,返回值为找到的元素结点的指针
LNode* LocateElem(LinkList L,ElemType e)
{
    LNode* p=L->next;//初始化p,使p指向首元结点(*p就表示这个首元结点)
    while(p&&p->data!=e)//顺链表扫描,直到p为空或者找到相应元素为止
    {
        p=p->next;
    }
    return p;
}

//单链表的插入
void LinkInsert(LinkList &L,int i,ElemType e)
{
    LNode* p=L;
    int j=0;
    while(p&&(j<i-1))
    {
        p=p->next;
        ++j;
    }//查找到第i-1个结点,并使p指向该结点
    if(!p||j>i-1)
    {
        cout<<"插入位置不合法!\n"<<endl;
        return;
    }
    LNode* s=new LNode;//生成新结点指针s
    s->data=e;//将结点指针s的数据域置为e
    s->next=p->next;
    p->next=s;
    cout<<"数据插入成功!\n"<<endl;


}

//单链表的删除
void ListDelete(LinkList &L,int i)
{
    LNode* p=L;
    int j=0;
    while((p->next)&&(j<i-1))
    {
        p=p->next;
        j++;
    }//查找表的第i-1个结点,p指向该结点
    if(!(p->next)||(j>i-1))
    {
        cout<<"删除位置不合理!\n"<<endl;
        return;
    }
    LNode* q=p->next;//临时保存被删结点的地址以备释放
    p->next=q->next;//改变删除结点前驱结点的指针域,指向删除结点的后继结点
    delete q;//释放删除结点的空间
}

//打印单链表
void PrintList(LinkList L) {
    LNode* p;
    if (L == NULL)
    {
        cout<<"该单链表为空!\n"<<endl;
        return;
    }
    p = L->next;
    while (p)
    {
        cout <<"print:"<< p->data << endl;
        p = p->next;
    }
}
//整表删除
Status ClearList(LinkList L) {
    LinkList p, q;
    if (L == NULL)
        return ERROR;
    p=L->next;
    while (p) {
        cout <<"clear:"<< p->data << endl;
        q = p->next;
        delete p;
        p = q;
        L->next = p;
    }
    if (!p)
        return ERROR;
    L->next = NULL;
    return OK;
}

//获得单链表的长度
Status GetLen(LinkList L) {
    Status len=0;
    LNode* p=L;
    if (L == NULL)
        return ERROR;
    while (p->next != NULL)
        {
            p = p->next;
            len++;
        }
    return len;
}
int main()
{
	//可调用上述方法尝试运行
    return 0;
}


憧憬

我会继续努力,持续学习技术、持续创作,不断提升自己,写出更好的文章,同时希望将来能拿到一个满意的offer。

Tips

  1. 您发布的文章将会展示至 里程碑专区 ,您也可以在 专区 内查看其他创作者的纪念日文章
  2. 优质的纪念文章将会获得神秘打赏哦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值