线性表的链式存储表示的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。链表的物理存储结构可表示为:
和顺序表一样,链表也具有插入,删除,遍历,查找等操作。由于链表和顺序表在物理存储上不同,所以在实现上也有所不同。特别是在插入和删除上体现较大的优势。
——插入:
——删除:
代码实现:
list_L.h
#ifndef __LIST_L_H__
#define __LIST_L_H__
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode,*LinkList;
void InitList_L(LinkList &L);
int ListLengh_L(LinkList L);
bool ListInsert_L(LinkList &L,int i,ElemType e);
bool ListDelete_L(LinkList &L,int i,ElemType &e);
bool GetElem_L(LinkList L,int i,ElemType &e);
void ListTraverse_L(LinkList L);
void DestroyList_L(LinkList &L);
#endif
list_L.cpp
#include "list_L.h"
#include "iostream"
#include "iomanip"
using namespace std;
void InitList_L(LinkList &L)
{
L = (LNode*)malloc(sizeof(LNode)); //分配一个节点的空间
if (!L) //若分配失败,则退出
{
exit(1);
}
L->next = NULL; //链表的下一节点为空
}
int ListLengh_L(LinkList L)
{
LinkList p;
int k = 0;
p = L->next;
while (p)
{
k++;
p = p->next;
}
return k;
}
bool ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList p,s;
int j = 0;
p = L;
while ((p->next) && (j < i - 1))
{
p = p->next;
j++;
}
if (j != i - 1)
{
return false;
}
if ((s = (LNode*)malloc(sizeof(LNode))) == NULL)
{
exit(1);
}
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete_L(LinkList &L,int i,ElemType &e)
{
LinkList p,q;
int j = 0;
p = L;
while ((p->next->next) && (j < i - 1))
{
p = p->next;
j++;
}
if (j != i - 1)
{
return false;
}
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return true;
}
void ListTraverse_L(LinkList L)
{
LinkList pL = L->next;
while (pL)
{
cout<<setw(6)<<pL->data;
pL = pL->next;
}
cout<<endl;
}
void DestroyList_L(LinkList &L)
{
LinkList p,p1;
p = L;
while (p)
{
p1 = p;
p = p->next;
free(p1);
}
L = NULL;
}
调用函数验证
main.cpp
#include <iostream>
#include "stdlib.h"
#include "list_L.h"
using namespace std;
int main()
{
LinkList head;
ElemType x=0;
int i,a[] = {6,8,16,2,34,56,7,10,22,45};
InitList_L(head);
for (i=1;i<=10;i++)
{
if (!ListInsert_L(head,i,a[i-1]))
{
cout<<"插入失败!"<<endl;
system("pause");
return 0;
}
}
cout<<"删除前的链表为:"<<endl;
ListTraverse_L(head);
cout<<"当前链表长度为:"<<ListLengh_L(head)<<endl;
cout<<"删除第4个元素"<<endl;
ListDelete_L(head,4,x);
cout<<"被删除的元素是:"<<x<<endl;
cout<<"删除后的链表为:"<<endl;
ListTraverse_L(head);
cout<<"当前链表长度为:"<<ListLengh_L(head)<<endl;
DestroyList_L(head);
system("pause");
return 0;
}
———————————————————————————————————————————————————