数据结构线性表的两种存储形式顺序表和单链表的比较

来源:互联网 发布:矩阵qr分解 编辑:程序博客网 时间:2024/06/05 14:17
#include <iostream>#include <iostream>#include<stdio.h>#include<malloc.h>#define MaxSize 50using namespace std;typedef char ElemType;typedef struct{    ElemType data[MaxSize];    int length;} SqList;typedef char ElemType;void InitList(SqList *&L){    L=(SqList*)malloc(sizeof(SqList));    L->length=0;}void DestroyList(SqList*&L){    free(L);}bool ListEmpty(SqList*L){    return (L->length==0);}int ListLength(SqList*L){    return (L->length);}void DispList(SqList*L){for(int i=0; i<L->length; i++)        printf("%c ",L->data[i]);    printf("\n");}bool GetElem(SqList *L,int i,ElemType &e){    if(i<1||i>L->length)        return false;    e=L->data[i-1];///注意,此时i是个数    return true;}int LocateElem(SqList*L,ElemType e){    int i=1;    while(i<=L->length&&L->data[i]!=e)        i++;    if(i>L->length)///注意,此时i是下标        return 0;    else        return i+1;///注意,此时i是下标}bool ListInsert(SqList *&L,int i,ElemType e){    int j;    if(i<1||i>L->length+1)        return false;    i--;    ///从右向左处理    for(j=L->length; j>i; j--)        L->data[j]=L->data[j-1];    L->data[i]=e;    L->length++;    return true;}bool ListDelete(SqList *&L,int i,ElemType &e){    if(i<1||i>L->length)        return false;    i--;    ///从左向右处理    e=L->data[i];    for(int j=i; j<L->length-1; j++)        L->data[j]=L->data[j+1];        L->length--;    return true;}int main(){    SqList *L;    ElemType e;    InitList(L);///这一句很重要哎,没有初始化不行    printf("顺序表操作试验如下:\n");    printf("采用尾插法插入元素a,b,c,d\n");    ListInsert(L,1,'a');    ListInsert(L,2,'b');    ListInsert(L,3,'c');    ListInsert(L,4,'d');    GetElem(L,3,e);    printf("获得第3个位置上的元素%c\n",e);    printf("b这个元素所在位置%d\n",LocateElem(L,'b'));    ListDelete(L,2,e);    printf("删除第2个元素后输出顺序表:\n");    DispList(L);    return 0;}
<img src="http://img.blog.csdn.net/20160330094641269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
#include <iostream>#include<malloc.h>#include<cstdio>using namespace std;typedef char ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;}LinkList;void InitList(LinkList *&L){    L=(LinkList*)malloc(sizeof(LinkList));    L->next=NULL;}void DestroyList(LinkList *&L){    LinkList *p=L->next,*pre=L;    while(p!=NULL)    {        free(pre);        pre=p;        p=pre->next;    }    free(pre);}int ListLength(LinkList*L){    int n=0;    LinkList *p=L;    while(p->next!=NULL)    {        n++;        p=p->next;    }    return n;}bool ListEmpty(LinkList *L){    return L->next==NULL;}void DispList(LinkList *L){    LinkList *p=L->next;    while(p!=NULL)    {        printf("%c ",p->data);        p=p->next;    }    printf("\n");}bool GetElem(LinkList *L,int i,ElemType &e){    int j=0;    LinkList *p=L;    while(p!=NULL&&j<i)///注意求线性表中元素值需找第i个节点呢    {        j++;        p=p->next;    }    if(p==NULL)        return false;    else    {        e=p->data;        return true;    }}int LocateElem(LinkList*L,ElemType e){    int i=1;    LinkList*p=L->next;    while(p!=NULL&&p->data!=e)    {        i++;        p=p->next;    }    if(p==NULL)        return 0;    else        return i;}bool ListInsert(LinkList*L,int i,ElemType e)///插入删除需要找到第i-1个节点{    LinkList *p=L,*s;    int j=0;    while(p!=NULL&&j<i-1)    {        p=p->next;        j++;    }    if(p==NULL)        return false;    else    {        s=(LinkList*)malloc(sizeof(LinkList));        s->data=e;        s->next=p->next;        p->next=s;        return true;    }}bool ListDelete(LinkList*L,int i,ElemType &e)///插入删除需要找到第i-1个节点{    LinkList *p=L,*q;    int j=0;    while(p!=NULL&&j<i-1)    {        p=p->next;        j++;    }    if(p==NULL)        return false;    else    {        q=p->next;        if(q==NULL)            return false;        e=q->data;        p->next=q->next;        free(q);        return true;    }}int main(){    LinkList*L;    ElemType e;    InitList(L);    ListInsert(L,1,'f');    ListInsert(L,2,'a');    ListInsert(L,3,'n');    ListInsert(L,4,'n');    ListInsert(L,5,'v');    GetElem(L,3,e);    printf("该单链表中第3个元素是%c\n",e);    printf("该单链表中a元素是第几个元素%d\n",LocateElem(L,'a'));    ListDelete(L,2,e);    printf("删除第2个元素后输出单链表\n");    DispList(L);    return 0;}


总结:顺序表操作主要是数组操作,而单链表操作则是一个一个节点操作

必须要初始化表

在单链表中求长度和参数有i时候定义LinkLsit *p=L,其他时候定义为LinkList *p=L->next;


0 0