C++学习-链表1-单链表
链表
1.1 单链表的存储
链表有多种,包括双链表,单循环链表等。这里主要讲单链表。
在一个单链表中,每个数据元素被存放在一个结点中,而结点同时也要包含它下一个结点的地址,使前一个结点和后一个结点链接起来。所以对于单链表的每个结点,其应该要包含两个要素———数据元素本身和指向下一个结点的指针。描述这样一节结点最合适的数据类型就是结构体。我们可以把结构体类型定义为:
struct linknode{
数据类型 数据;
linknode *next; //结构体内部可以定义一个指向自己这一结构体类型的指针
};
如果每个结点都存了一个整型数,那么结点的类型可以为:
struct linknode{
int date;
linknode *next;
};
当然也可以是数组或者其他结构体类型:
struct linknode{
int date[100];
linknode *next;
};
1.2 单链表的操作
我们就可以定义自己想要的结点数目并通过指针把它们相互链接形成一个单链表了。对于一个节点,可以这么创建:
struct linknode{
int date;
linknode *next;
};
linknode *p1=new linknode;
cin>>p1->date; //存数据
p1->next=p2; //p2是下一个节点的地址
通过循环我们可以建立一个单链表:
linknode *p;
for(i=0;i<n;++i)
{
p=new linknode;
cin>>p->date;
p->next????
}
由于下一个节点还没有建立,所以单次无法完成指针的指向,所以我们可以先建立一个表头head,同时还需要一个指向表尾的指针rear,表头我们不一定要进行赋值,我们可以单纯的把它记录为链表的开始,再通过循环建立链表:
linknode *p;
linknode *head=new linknode;
linknide *rear=head;
for(i=0;i<n;++i)
{
p=new linknode;
cin>>p->date;
rear->next=p;
rear=p;
}
rear->next=NULL; //把最后一个结点赋为空指针,表示末尾
链表自然也可以插入和删除:
如果我们要在结点p后插入一个结点
tmp=new linknode; //创建一个新结点
tmp->date=x; //存数据
tmp->next=p->next; //把新结点后p的下一节点相连
p->next=tmp; //把p和新结点连接起来
如果我们要删除结点p后的一个结点:
linknode *tmp=p->next;
p->next=p->next->next;
delete tmp;
而对于第一个结点,我们可以通过表头来进行对其进行插入和删除。
这里再次声明一下头结点 : 头结点是链表中额外接入的一个特殊结点,它不存放数据,只是作为链表的开始标记,位于链表的最前面,它的指针部分指向表中的第一个元素。
最后
链表就是一坨屎
——娜娜明

浙公网安备 33010602011771号