线性表
(一)线性表顺序存储结构:
优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间。
可以快速地存取表中任一位置的元素。
缺点:插入和删除操作需要移动大量元素。
当线性表长度变化较大时,难以确定存储空间的容量。
造成存储空间的"碎片"。
代码如下:
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 }
广义表:
多重链表:
例如 稀疏矩阵