链表是线性表中典型的一个数据结构,本文讲介绍如何实现。本文代码在VC6.0上运行验证过。
首先建立一个链表结构:
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
一个链表结点包含两个数据项,一个是该结点存储的数值数据,一个是该结点指向下一个结点的地址数据,也就是一个指向下一个结点的指针。接下来,为了大家能够清晰的明白链表的实现过程,将源码粘贴如下(关键部分都有注释):
#include<iostream.h>
#include<malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreatList_L(LinkList &L,int n)//创建一个包含n个元素的链表L
{
L=(LinkList)malloc(sizeof(LNode));//开辟一个头结点空间
L->next=NULL;
L->data=n;//将首次建立结点的个数存到头结点的数据项中,也可以什么都不存,即没有这条语句
for(int i=n;i>0;--i)
{
LinkList p=(LinkList)malloc(sizeof(LNode));//开辟第一个结点空间
cin>>(p->data);//输入一个数据,
//将新结点插入到头结点之后
p->next=L->next;
L->next=p;
}
}
void OutputList(LinkList &L)//输出链表L所存储的数值数据
{
LinkList temp=(LinkList)malloc(sizeof(LNode));//建立一个临时结点
temp=L;
cout<<temp->data<<endl;//输出头结点的数值数据
while(temp->next!=NULL)
{
temp=temp->next;//将下一个结点放入临时结点
cout<<temp->data<<endl;//输出数值数据
}
}
void InsertLinkList(LinkList &L,int n,int e)//在链表L第n个位置插入元素e
{
int i=0;
LinkList temp=(LinkList)malloc(sizeof(LNode));//开辟临时空间
temp=L;
while(temp->next!=NULL)//寻找第n-1个位置,因为该链表是单向的,所以每个结点都指向下一个结点,所以,要想插入第n个位置需找到第n-1个位置
{
if(i==(n-1))
break;
temp=temp->next;
i++;
}
if(i<n-1)
cout<<"error"<<endl;
else
{
LinkList p=(LinkList)malloc(sizeof(LNode));//开辟新的空间
p->data=e;
p->next=temp->next;//将参数插入
temp->next=p;
}
}
int main()
{
LinkList L;//定义一个头结点
CreatList_L(L,5);//创建见一个头结点为L的5个元素的链表
InsertLinkList(L,3,10);//在链表L的第3个元素的位置插入元素10
OutputList(L);
return 0;
}
如上代码只是一个如何建立链表的例子,还有很多不严谨的地方。该代码的目的是能提供一个链表建立的实例,在学习链表的时候做一个参考。