标签:
线性表(List):n个数据的有限集合
1. 顺序结构:用一段地址连续的储存单元依次存储线性表的数据元素
结构代码:
1 #define MAXSIZE 20 //储存空间初始分配量 2 typedef int ElemType; //根据实际情况,这里假设为int 3 typedef struct 4 { 5 ElemTyoe data[MAXSIZE] ; //数组存储数据元素,最大值为MAXSIZE 6 int length=0; //线性表长度 7 }SqList;
三个属性:存储空间的起始位置(数组data)线性表的最大存储容量(最大长度MAXSIZE)、线性表的当前长度(length)
地址计算:对于第i个元素ai的存储位置可以由a1推出,若一个数据元素占用c个存储单元,则LOC(ai)= LOC( a1)+( i-1 )*c
获取元素:
1 //操作:用e返回L中第i个元素的值 2 typedef int Status 3 Status GetElem(Sqlist l, int i, ElemType *e) 4 { 5 if(L.length==0||i<1||i>L.length) 6 return 0; 7 *e=L.data[i-1]; 8 return 1; 9 }
插入元素:
1 //操作:在L中第i个位置之前插入新的元素e 2 Status ListInsert(Sqlist *L,int i,ElemType e) 3 { 4 int k; 5 if(L->length==MAXSIZE)//线性表已满 6 return 0; 7 if(i<1||i>L->length+1)//当i不在范围 8 return 0; 9 if(i<=L->length)//插入位置以后后移 10 { 11 for(k=L->length-1;k>=i-1;k--) 12 L->data[k+1]=L->data[k]; 13 } 14 L->data[i-1]=e; 15 l->length++; 16 return 1; 17 }
删除元素:
1 //操作:删除L的第i个元素,并用e返回其值 2 Status ListDelete(Sqlist *L,int i,ElemType *e) 3 { 4 int k; 5 if(L->length==0)//线性表为空 6 return 0; 7 if(i<1||i>L->length)//删除位置不正确 8 return 0; 9 *e=L->[i-1]; 10 if(i<L->length) 11 { 12 for(k=i;k->length;k++)//后继元素前移 13 L->data[k-1]=L->data[k]; 14 } 15 L->length--; 16 return 1; 17 }
完整实现:
1 //顺序链表实现 2 #include<iostream> 3 using namespace std; 4 #define MAXSIZE 20 //储存空间初始分配量 5 typedef int ElemType; //根据实际情况,这里假设为int 6 typedef struct 7 { 8 ElemType data[MAXSIZE] ; //数组存储数据元素,最大值为MAXSIZE 9 int length=0; //线性表长度 10 } Sqlist; 11 Sqlist s;//为求简便输出使用全局变量 12 //操作:用e返回L中第i个元素的值 13 typedef int Status; 14 void print() 15 { 16 cout << "Item: "; 17 for (int i = 0; i < s.length; i++) 18 cout << s.data[i] << ‘ ‘; 19 cout << "Length: " << s.length << endl; 20 } 21 Status GetElem(Sqlist L, int i, ElemType *e) 22 { 23 if (L.length == 0 || i < 1 || i > L.length) 24 return 0; 25 *e = L.data[i - 1]; 26 return 1; 27 } 28 //操作:在L中第i个位置之前插入新的元素e 29 Status ListInsert(Sqlist *L, int i, ElemType e) 30 { 31 int k; 32 if (L->length == MAXSIZE) //线性表已满 33 return 0; 34 if (i < 1 || i > L->length + 1) //当i不在范围 35 return 0; 36 if (i <= L->length) 37 { 38 for (k = L->length - 1; k >= i - 1; k--) 39 L->data[k + 1] = L->data[k]; 40 } 41 L->data[i - 1] = e; 42 L->length++; 43 print(); 44 return 1; 45 } 46 //操作:删除L的第i个元素,并用e返回其值 47 Status ListDelete(Sqlist *L, int i, ElemType *e) 48 { 49 int k; 50 if (L->length == 0) //线性表为空 51 return 0; 52 if (i < 1 || i > L->length) //删除位置不正确 53 return 0; 54 *e = L->data[i - 1]; 55 if (i < L->length) 56 { 57 for (k = i; k < L->length; k++) //后继元素前移 58 L->data[k - 1] = L->data[k]; 59 } 60 L->length--; 61 print(); 62 return 1; 63 } 64 void list() 65 { 66 cout << "Options: "<<endl<< "1.Find"<<endl << "2.Insert"<<endl << "3.Delete"<<endl; 67 } 68 int main() { 69 cout << "The implent of list" << endl; 70 cout << "length:" << endl; 71 cin >> s.length; 72 cout << "The item of list:" << endl; 73 for (int i = 0; i < s.length; i++) 74 cin >> s.data[i]; 75 print(); 76 while (1) 77 { 78 int choose; 79 list(); 80 cin>>choose; 81 if (choose == 1) { 82 int elem, i; 83 cout << "Find:"<<endl; 84 cin >> i; 85 GetElem(s, i, &elem); 86 cout << elem << endl; 87 } 88 if (choose == 2) { 89 int i, e; 90 cout << "Insert:"<<endl; 91 cin >> i >> e; 92 ListInsert(&s, i, e); 93 } 94 if (choose == 3) { 95 int i, e; 96 cout << "Delete:"<<endl; 97 cin >> i; 98 ListDelete(&s, i, &e); 99 cout << e << "has been deleted." << endl; 100 } 101 } 102 }
标签:
原文地址:http://www.cnblogs.com/yueshangzuo/p/5894271.html