单链表基础结构实现
- 这里我并没有写增删改查的功能,参考了数据结构严蔚敏版一书。然后我发现按他的那段初始化伪代码实现后,结点倒过来了,不过并不影响道理。
- 重点需要搞清楚单链表的结构,C好久没用去学面向对象了,结构体和malloc我有点忘记了,码在这里以后忘了当参考。
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
//单链表的实现
typedef struct LinkedList{
struct LinkedList* next; //当前结点的指针域next存储下一个结点的位置
int data; //数据域
}linkedList,* ptrList;
void creatList(ptrList& L,int n)
{
//malloc: 为elem类型指针分配内存
//为头结点分配内存
L=(ptrList)malloc(sizeof(linkedList));
L->next=NULL;
ptrList p;
for(int i=0;i<n;i++)
{
//创建n个结点,分配内存空间
p=(ptrList)malloc(sizeof(linkedList));
cout<<"请输入第"<<i+1<<"个元素的值:";
//scanf("%d",p->data);
cin>>p->data;//给每个结点的数据域赋值
cout<<endl;
p->next=L->next; //它的指针域为空
L->next=p; //头结点的指针域指向它
//以上的这个过程画成图实际上是后继生成的结点都往上一个结点前的位置插入
}
}
void printList(ptrList& L,int n)
{
for(int i=0;i<n;i++)
{
printf("%d",(L->next)->data);
L->next=(L->next)->next;
}
}
int main()
{
ptrList L;
creatList(L,5);
printList(L,5);
//cout<<(L->next)->data;
return 0;
}
运行结果:
循环链表
- 循环链表是另一种形式的链式存储结构,它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。由此从表中任一结点出发均可找到表中其他结点。
- 循环链表的操作和单链表基本一致,差别仅在于算法中的循环条件不是p或p->next是否为空,而是它们是否等于头指针。
- 但有的时候,若在循环链表中设立尾指针而不设头指针,可使某些操作简化。例如将两个线性表合并成一个表时,仅需将一个表的表尾和另一个表的表头相接即可。
双向链表
- 上面说到的单链表和循环链表,从某个结点出发只能顺指针往后寻找其他结点。若要寻找结点的直接前驱,则需要从表头指针出发,为克服这种单向性的缺点,可利用双向链表。
- 双向链表的结点中有两个指针域,一个指向其直接前驱,一个指向其直接后继。故双向链表也可以有循环表,其第一个结点的前驱指向最后一个结点,其最后一个结点的后继指向第一个结点。