• 线性表


    (一)线性表顺序存储结构:

    优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间。

       可以快速地存取表中任一位置的元素。

    缺点:插入和删除操作需要移动大量元素。

         当线性表长度变化较大时,难以确定存储空间的容量。

       造成存储空间的"碎片"。

    代码如下:

     1 #define MAXSIZE 20
     2 #define OK 1
     3 #define ERROR 0
     4 #define TRUE 1
     5 #define FALSE 0
     6 typedef int ElemType;
     7 typedef int Status;
     8 typedef struct
     9 {
    10     ElemType data[MAXSIZE];
    11     int length;
    12 }SqList;
    13 class SequenceList
    14 {
    15 public:
    16     Status GetElem(SqList L,int i,ElemType *e);
    17     Status InsertElem(SqList L,int i,ElemType *e);
    18     Status DeleteElem(SqList L,int i,ElemType *e);
    19     Status ModifyElem(SqList L,int i,ElemType *e);
    20     SequenceList(void);
    21     ~SequenceList(void);
    22 };
    23 Status GetElem(SqList L,int i,ElemType *e)
    24 {
    25     if (L.length==0)
    26     {
    27         return ERROR;
    28     }
    29     if(i<1||i>L.length)
    30         return ERROR;
    31     *e=L.data[i-1];
    32     return OK;
    33 }
    34 Status InsertElem(SqList L,int i,ElemType *e)
    35 {
    36     if(L.length==MAXSIZE)
    37         return ERROR;
    38     if(i<1||i>L.length+1)
    39         return ERROR;
    40     if(i<=L.length){
    41         for (int k=L.length-1; k>=i-1; k--)
    42         {
    43             L.data[k+1]=L.data[k];
    44         }
    45     }
    46     L.length++;
    47     L.data[i-1]=*e;
    48     return OK;
    49 }
    50 
    51 Status DeleteElem(SqList L,int i,ElemType *e)
    52 {
    53     if(L.length==0)
    54         return ERROR;
    55     if(i<1||i>L.length)
    56         return ERROR;
    57     *e=L.data[i-1];
    58     if (i<L.length)
    59     {
    60         for (int k= i; k < L.length; k++)
    61         {
    62             L.data[i-1]=L.data[i];
    63         }
    64     }
    65     L.length--;
    66     return OK;
    67 }
    68 Status ModifyElem(SqList L,int i,ElemType *e)
    69 {
    70     if(i<1||i>L.length)
    71         return ERROR;
    72     L.data[i-1]=*e;
    73     return OK;
    74 }

    链式结构:

      1 typedef int ElemType;
      2 typedef struct Node
      3 {
      4     ElemType data;
      5     struct Node *next;
      6 }List;
      7 List *p,*q,*l;
      8 
      9 void InitList(List *list){
     10     list=(List*)malloc(sizeof(List));
     11     list->next=NULL;
     12     return ;
     13 }
     14 void InsertFirstList(List *L,ElemType e)
     15 {
     16     p=(List*)malloc(sizeof(List));
     17     if(p==NULL)
     18     {
     19      cout << "链表为空,插入值失败!" << endl;  
     20      exit(1);
     21     }
     22     p->data=e;
     23     p->next=L;
     24     L=p;
     25     return ;
     26 }
     27 void InsertLastList(List *L,ElemType e)
     28 {
     29     p=q=(List*)malloc(sizeof(List));
     30     p=L;
     31     if(p==NULL)
     32     {
     33          cout << "链表为空,插入值失败!" << endl; 
     34          exit(1);
     35     }
     36     while (p->next!=NULL)
     37     {
     38         p=p->next;
     39     }
     40     q->data=e;
     41     q->next=p->next;
     42     p->next=q;
     43     return;
     44 }
     45 //在第i个位置前面添加
     46 List *Insert(ElemType e,List *L,int i)
     47 {
     48     p=q=(List*)malloc(sizeof(List));
     49     if(i==1)
     50     {
     51         p->data=e;
     52         p->next=L;
     53         return p;
     54     }
     55     p=FindKth(i-1,L);
     56     if (p==NULL)
     57     {
     58         cout<<"参数错误!"<<endl;
     59         return NULL;
     60     }
     61     q->data=e;
     62     q->next=p->next;
     63     p->next=q;
     64     return L;
     65 
     66 }
     67 List *Delete(int i,List *L)
     68 {
     69     p=q=(List*)malloc(sizeof(List));
     70     if(i==1)
     71     {
     72         p=L;
     73         if(L!=NULL)
     74             L=L->next;    
     75         else return NULL;
     76         free(p);
     77         return L;
     78     }
     79     p=FindKth(i-1,L);
     80     if(p==NULL||p->next==NULL)
     81     {
     82         cout<<"位置错误!"<<endl;
     83         return NULL;
     84     }
     85     q=p->next;
     86     p->next=q->next;
     87     free(q);
     88     return L;
     89 }
     90 List *FindKth(int k,List * L)
     91 {
     92     int i=0;
     93     p=(List*)malloc(sizeof(List));
     94     p=L;
     95     while (&p->next!=NULL&&i<k)
     96     {
     97         p=p->next;
     98         i++;
     99     }
    100     if(i==k)return p;
    101     else
    102         return NULL;
    103 }
    104 List *Find(ElemType e,List *L)
    105 {
    106     p=(List*)malloc(sizeof(List));
    107     p=L;
    108     while (p->data!=e&&p->next!=NULL)
    109     {
    110         p=p->next;
    111     }
    112     return p;
    113 }
    114 int GetLength(List *L)
    115 {
    116     int length=0;
    117     p=(List*)malloc(sizeof(List));
    118     p=L;
    119     while (p->next!=NULL)
    120     {
    121         length++;
    122         p=p->next;
    123     }
    124     return length;
    125 }


     1 void DestroyList(List *L)
     2 {
     3      q = p = (LinkList *)malloc(sizeof(LinkList));  
     4      p = L;//得到头结点的地址   
     5      q = p->next;   
     6      //逐一对结点的内存进行释放!   
     7      while (q != NULL){  
     8            p = q;  
     9            free(q);   
    10            q = p->next;   
    11      }   
    12      free(L);//释放头结点的内存   
    13      return ;   
    14 }

     广义表:

     

    多重链表:

    例如 稀疏矩阵

  • 相关阅读:
    js 去掉文本域中的空格
    网站开发步骤
    获取客户端、服务器、本地IP地址
    c#用反射原理递归遍历复杂实体对象
    jquery1.8在ie8下not无效?
    状态模式
    虚函数和抽象函数的区别
    HashTable、HashSet和Dictionary的区别
    sql视图学习笔记--视图
    html背景为灰色 不能操作,中间div可以操作
  • 原文地址:https://www.cnblogs.com/shide/p/4269030.html
Copyright © 2020-2023  润新知