如何将单链表像顺序表一样的整表元素创建
首先声明一个单链表结构体。
typedef struct LNode
{
int data;
struct LNode * next;
}LNode,*LinkNode;
链式存储如何一次性存储足够多的数据,顺序表是直接通过索引遍历赋值就可以直接完成。
#include<iostream>
using namespace std;
#define MaxSize 10
typedef struct SqList
{
int data[MaxSize];
int length;
}SqList;
int main()
{
SqList Lq; //顺序表
Lq.length=0;
for(int i=0;i<=10;i++)
{
cin>>Lq.data[Lq.length++];
}
}
但是假如是单链表的话,则需要使链表的头结点开始遍历,每一次都指向下一个next的地址,在依次将数据赋值给当前的L->data。当然,这种思路在顺序表是可行的,因为他开辟了一片连续的地址空间,可以依次遍历。而链表不同,假如你不做处理的话,L->next根本不知道指向的是那一片空间,所以根本不可能有L=L->next这种说法。所以要想实现类似于顺序表的遍历赋值的话,是需要每次开辟一个LNode结点的空间来插入在L->next中,多次插入就出现了依次遍历的效果了。
int main()
{
LNode L; //声明一个名为L的链表 ,L也是头结点
}
链表的插入数据的方法,常用的有两种:1.头插法,2.尾插法。
刚好是跟顺序表做的对比,那么就实现一下,如何将开头创建顺序表的LN.data数组里面的元素添加到链表L中。
1.头插法。
每次添加的元素都插入在了头结点的下一个结点上,也就是类似逆序输出。
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MaxSize 10
typedef struct SqList{
int data[MaxSize];
int length;
}SqList;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkNode;
void createLNode(LNode *&L,int dataS[],int n)
{
for(int i=0;i<n;i++)
{
LNode *k;
k=(LNode*)malloc(sizeof(struct LNode));
k->data = dataS[i];
k->next=NULL;
k->next = L->next;
L->next = k;
}
}
int main()
{
SqList S;
S.length=0;
cout<<"请输入10个数字:";
for(int i=0;i<10;i++)
{
cin>>S.data[S.length++];
}
LNode *L;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
createLNode(L,S.data,S.length);
L=L->next;
cout<<"链表中的元素为:";
while(L)
{
cout<<L->data<<" ";
L=L->next;
}
return 0;
}
输出结果:
2.尾插法
在插入前需要保留头结点指针,因为尾插法每次插入会改变L所指的结点,不在总是指向头结点。
尾插法不会改变传入数据的先后数据。
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MaxSize 10
typedef struct SqList{
int data[MaxSize];
int length;
}SqList;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkNode;
LNode* createLNode2(int dataS[],int n)
{
LNode *L;
LNode *W;
L = (LNode*)malloc(sizeof(LNode));
W=L;
for(int i=0;i<n;i++)
{
LNode *k;
k=(LNode*)malloc(sizeof( LNode));
k->data = dataS[i];
k->next=NULL;
L->next = k;
L = L->next;
}
return W;
}
int main()
{
SqList S;
S.length=0;
cout<<"请输入10个数字:";
for(int i=0;i<10;i++)
{
cin>>S.data[S.length++];
}
LNode *L;
//L=(LNode *)malloc(sizeof(LNode));
//L->next=NULL;
//createLNode1(L,S.data,S.length);
L=createLNode2(S.data,S.length);
L=L->next;
cout<<"链表中的元素为:";
while(L)
{
cout<<L->data<<" ";
L=L->next;
}
return 0;
}
输出结果:
尾插法和头插法的代码实现很容易,所以就没有叙述为何了。
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。