您的位置:首页 > 其它

线性表的链式存储(链表)

2013-02-27 15:08 295 查看
线性表的顺序存储结构最大的缺点是:插入和删除时需要移动大量的元素,这显然需要耗费时间,链式存储结构解决这个问题。



#include<iostream>
using namespace std;
typedef int ElemType;
const int OK = 1;
const int ERROR =0;
const int TRUE = 1;
const int Flase =0;
typedef int Status;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;

void CreateHead(LinkList *L,int n)//在函数体内指针本身也需要修改,所以这里的L是指向指针的指针
{
srand(time(0));//初始化随机数种子
(*L)=(LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
LinkList p;
for(int i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;
p->next = (*L)->next;
(*L)->next = p;
}
}

void CreateTail(LinkList *L,int n)
{
srand(time(0));
(*L)=(LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
LinkList p,r;
r=*L;

for(int i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;
r->next=p;
r=p;
}
p->next = NULL;//r->next = NULL;
}

/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)*/
/*操作结果:用e返回L中第i个数据元素的值*/
Status GetElem(LinkList L,int i,ElemType *e)
{
Node *p;
p=L->next;
int j=1;//因为参数i表示第i个元素,所以j的下标从1开始。
while(j<i && NULL!=p)
{
p=p->next;
++j;
}
if(NULL==p || j>i)
return ERROR;
*e = p->data;
return OK;
}

/*操作结果:在第i个位置后面插入新的数据元素e,L的长度加1*/
Status ListInsert(LinkList *L,int i,ElemType e)
{
Node *p;
p=(*L)->next;
int j=1;
while( j<i && NULL!=p )
{
p=p->next;
++j;
}
if(NULL==p || j>i)
return ERROR;
Node *s = (Node*)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}

Status LinkListDelete(LinkList *L,int i,ElemType *e)
{
Node *p;
p=(*L)->next;
int j=1;
while( j<i && NULL!=p )
{
p=p->next;
++j;
}
if(NULL==p || j>i)
return ERROR;
Node *q;
q = p->next;
*e = q->data;
p->next = q->next;
free(q);
return OK;
}

Status ClearList(LinkList *L)
{
Node *p,*q;
p=(*L)->next;
while(NULL!=p)
{
q=p->next;
free(p);
p=q;
}
(*L)->next =NULL;
return OK;
}

void PrintLinkList(LinkList list)
{
Node *p;
p=list->next;
while(NULL!=p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}

int main()
{
LinkList La;
CreateHead(&La,10);
cout<<"La:";
PrintLinkList(La);
ElemType e;
GetElem(La,6,&e);
cout<<"GetElem(La,6,&e):"<<e<<endl;
ListInsert(&La,6,66);
cout<<"ListInsert(&La,6,66):";
PrintLinkList(La);
LinkListDelete(&La,6,&e);
cout<<"LinkListDelete(&La,6,&e):";
cout<<"(e: "<<e<<") ";
PrintLinkList(La);
ClearList(&La);
cout<<"after ClearList():";
PrintLinkList(La);
getchar();
}
结果:



注意第15行代码,如果不是*L则会出错,原因:参数传递中,指针本身不改变
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: