线性表

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

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

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

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

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

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

代码如下:

 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 }

 

 广义表:

 

 

多重链表:

例如 稀疏矩阵

 

posted @ 2015-02-04 17:08  佬D  阅读(293)  评论(0编辑  收藏  举报