线性链表是一种数据存储结构,其分为顺序存储结构和链式存储结构。
顺序存储结构存储数据的方式和平时接触到的数组是一样的,其数据结构定义如下:
#define MAXSIZE 100
typedef struct sqList
{
ElemType data[MAXSIZE];
int length;
};
关于链表的初始化,寻找数据,插入数据,删除数据等操作,与数组类似,这里就不做详细介绍了。但是就插入,删除数据时,其总是要移动数据结构,其时间复杂度就为O(n),不太方便。从而引入了链式存储结构,其数据结构(也称之为结点)定义如下:
typedef struct Node
{
ElemType data;
Node *next;
};其包括一个数据域和指针域,指针域是指向下一个结点的指针。
对于链式存储结构其有头结点和头指针,头结点不是必须有的。下面介绍一下有关链式存储的几种操作:
(1)创建链表(有两种方法头插法和尾插法)代码如下:
<pre name="code" class="cpp">void CreateListHead(LinkList *L, int n)
{
LinkList p;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL; //头指针指向头结点
if(n<=0)
cout<<"the size of link error";
else
{
for(int i=0;i<n;i++)
{
ElemType temp;
cin>>temp;
p = (LinkList)malloc(sizeof(Node));
p->data=temp;
p->next = (*L)->next;
(*L)->next = p;
}
}
}
<pre name="code" class="cpp">void CreateListTail(LinkList*L,int n)
{
LinkList p,r;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
r = *L;
if(n<=0)
cout<<"the size of link error";
else
{
for(int i=0;i<n;i++)
{
ElemType temp;
cin>>temp;
p = (LinkList)malloc(sizeof(Node));
p->data=temp;
r->next = p;
r=p;
}
r->next = NULL;//千万不要忘了最后一个节点的指针域为NULL
}
(2)插入链表
void InsertList(LinkList L,int i,ElemType e)
{
//首先要遍历链表找到要插入数据的位置
for(int j =1;j<i;j++)
{
L=L->next;
}
//然后进行插入
LinkList p;
p=(LinkList)malloc(sizeof(Node))
p->data = e;
p->next = L->next;
l->next = p;
}
(3)删除链表中的数据
void DeleteList(LinkList L,int i,ElemType e)
{
//首先也是要遍历链表找到要删除的位置
LinkList p;
for(int j=1;j<i;j++)
{
L=L->next;
}
p=L->next;
L->next= L->next->next;
free(p);
}//
上述的插入和删除函数都没有对输入的i进行判断,所以当我们进行编程要考虑L是否为空i是否超出了链表的长度等问题,从而使编程问题严密化。