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

来源:互联网 发布:阿里云os 魅族 编辑:程序博客网 时间:2024/05/17 23:01

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


#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则会出错,原因:参数传递中,指针本身不改变