机缘
其实最早接触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