一、线性表的特性
1、线性结构的特性
(1)集合中必存在唯一的“第一元素”和唯一的“最后元素”。
(2)除最后一个元素之外,均有唯一的后继和唯一的前驱。
2、线性表的基本操作过程
(1)用 Setnull(L)置空表;
(2)用Length(L)求表的长度和表中各元素的个数;
(3)用Get(L,i)获取表中的第i个元素(1=<i<=n);
(4)用Prior(L,i)获取i的前驱元素;
(5)用Next(L,i)获取i的后继元素;
(6)用Locate(L,x)返回指定元素在表中的位置;
(7)用Insert(L,i,x)插入新元素;
(8)用Delete(L,x)删除已存在的元素;
(9)用Empty(L)来判断是否为空。
3、线性表的结构特点
均匀性、有序性。
二、顺序表操作
线性表的基本操作过程如下:
(1)计算顺序表的长度
public int GetLength() { return last + 1; //顺序表的长度就是数组最后一个元素的索引last加1 }
(2)清空操作
public void Clear() { return last = - 1;//清空所有元素,此时last=-1 }
(3)判断线性表是否为空
public bool IsEmpty() { if (last==-1) { return true; } else { return false; } }
(4)判断线性表是否为满
public bool IsFull() { if (last==maxsize-1) { return true; } else { return false; } }
(5)附加操作
public void Append(T item) { if (IsFull()) { Console.WriteLine("List is full");//在末尾加元素 } data[++last] = item; }
(6)插入操作
public void Insert(T item, int i) { //判断顺序表是否已满 if(IsFull()) { Console.WriteLine("List is full"); return; } //判断插入的位置是否正确, //i小于1表示在第1个位置之前插入 //i小于last+2表示在最后一个元素后面的第2个位置插入。 if (i<1||i>last+2) { Console.WriteLine("Position is error!"); return; } //在顺序表的表尾插入数据元素 if (i==last+2) { data[i - 1] = item; } else //在表的其他位置插入数据元素 { //元素移动 for (int j = last; j >= i - 1;--j) { data[j + 1] = data[j]; } //将新的数据元素插入到第i个位置上 data[i - 1] = item; } //修改表长 ++last; }
(7)删除操作
public T Delete(int i) { T tmp = default(T); //判断表是否为空 if (IsEmpty()) { Console.WriteLine("List is empty"); return tmp; } //判断删除的位置是否正确 //i小于1表示删除1个位置之前的元素 //i大于last+1表示删除最后一个元素后面的第1个位置的元素 if (i<1||i>last+1) { Console.WriteLine("Position is error!"); return tmp; } //删除的是最后一个元素 if (i==last+1) { tmp = data[last--]; return tmp; } else //删除的不是最后一个元素 { //元素移动 tmp = data[i - 1]; for (int j = i; j <= last;++j) { data[j] = data[j++]; } } //修改表长 --last; return tmp; }
(8)获取元素
public T GetElem(int i) { if (IsEmty()||(i<1) || (i>last + 1)) { Console.WriteLine("List is Empty or Position is error!"); return default(T); } return data[i - 1]; }
(9)按值查找
public int Locate(T value) { //顺序表为空 if (IsEmty()) { Console.WriteLine("List is Empty!"); return -1; } int i = 0; //循环处理顺序表 for (i = 0; i <= last;++i) { //顺序表中存在与给定值相等的元素 if (values.Equals(data[i]) { break; } } //顺序表中不存在与给定值相等的元素 if (i>last) { return -1; } return i; }
三、链表操作
创建链表CreateLinkList(int n)、插入节点insertList(LinkList *list,LinkList q,ElemType e)、删除节点delLink(Link *list,LinkList r,LinkList q)、销毁链表destory(LinkList *list)
四、实例演练
(1)顺序表的实例
代码实现:
1 #include "malloc.h" 2 #include "conio.h" 3 #include "stdlib.h" 4 #define LIST_INIT_SIZE 10 5 #define LISTINCREMENT 10 6 #define ERROR 0 7 #define OK 1 8 #define OVERFLOW -2 9 10 typedef struct 11 { 12 int *elem; 13 int length; 14 int listsize; 15 }SqList;//定义线性表结构体 16 17 //初始化链表 18 int InitList_Sq(SqList *L) //括号中传递的参数是它的指针,只有这样才能改变它的指向的元素。 19 { 20 int i; 21 L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int)); 22 if (!L->elem) 23 { 24 exit(OVERFLOW); 25 } 26 L->length = 10; 27 L->listsize = LIST_INIT_SIZE;//分配初始的空间 28 for (i = 0; i < L->length;i++) 29 { 30 L->elem[i] = i; 31 } 32 return OK; 33 }//InitList_Sq 34 35 //求表长 36 int get_length(SqList *L) 37 { 38 return L->length; 39 } 40 41 //销毁线性表 42 int destroy(SqList *L) 43 { 44 L->length = 0; 45 return OK; 46 } 47 48 //插入元素 49 int ListInsert_Sq(SqList *L, int i, int e) 50 { 51 //在顺序表中的第i个位置之前插入新的元素e 52 //i的合法位置为1<=i<=ListLength_Sq(L)+1 53 int *newbase, *q, *p; 54 if (i<1||i>L->length+1) 55 { 56 return ERROR; 57 } 58 if (L->length>=L->listsize) 59 { 60 //当前存储空间已满,增加分配 61 newbase = (int *)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(int)); 62 if (!newbase) //存储空间分配失败 63 { 64 exit(OVERFLOW); 65 } 66 L->elem = newbase; 67 L->listsize += LISTINCREMENT; 68 } 69 q = &(L->elem[i - 1]); 70 for (p = &(L->elem[L->length - 1]); p >= q;--p) 71 { 72 //插入位置及之后的元素右移 73 *(p + 1) = *p; 74 } 75 *q = e; 76 ++L->length; 77 return OK; 78 } 79 80 81 //删除元素 82 int ListDelete_Sq(SqList *L, int i, int e) 83 { 84 //在顺序表中的删除第i个位置的元素e,并用e返回其值。 85 //i的合法位置为1<=i<=ListLength_Sq(L) 86 int *q, *p; 87 if (i<1 || i>L->length) //i值不合法 88 { 89 return ERROR; 90 } 91 p = &(L->elem[i - 1]); //被删除元素的位置 92 e = *p; 93 q = L->elem + L->length - 1; //表尾元素的位置 94 for (++p; p <= q; ++p) 95 { 96 //插入位置及之后的元素左移 97 *(p - 1) = *p; 98 } 99 --L->length; //表长减1 100 return OK; 101 } 102 103 //显示所有元素 104 int display_all(SqList *L) 105 { 106 int i; 107 for (i = 0; i < L->length;i++) 108 { 109 printf("%d", L->elem[i]); 110 printf(" "); 111 } 112 return OK; 113 } 114 115 int main() 116 { 117 SqList L; 118 int get=0, e = 0; 119 int i, num; 120 InitList_Sq(&L); 121 do 122 { 123 printf("请输入你要进行的操作序号 "); 124 printf("1,线性表置空 "); 125 printf("2,求线性表长度 "); 126 printf("3,数据元素的插入操作 "); 127 printf("4,数据元素的删除操作 "); 128 printf("5,显示线性表中的全部元素 "); 129 printf("6,退出 "); 130 scanf("%d", &get); 131 switch (get) 132 { 133 case 1: 134 destroy(&L); //将顺序表置空,只需要将其长度置零 135 break; 136 case 2: 137 printf("该线性表的长度是%d ", get_length(&L));//求取线性表的长度 138 break; 139 case 3: 140 //在指定的位置插入元素 141 printf("请输入你要插入元素的位置(即在第i个元素之前插入)以及插入元素 ");//求取线性表的长度 142 scanf("%d,%d", &i, &num); 143 ListInsert_Sq(&L, i, num); 144 printf("新的线性表是 "); 145 display_all(&L); 146 break; 147 case 4: 148 //删除指定的位置的元素 149 printf("请输入你要删除元素的位置(即删除第i个元素) ");//求取线性表的长度 150 scanf("%d,%d", &i); 151 ListDelete_Sq(&L, i, e); 152 printf("新的线性表是 "); 153 display_all(&L); 154 break; 155 case 5: 156 //显示线性表所有的元素 157 display_all(&L); 158 printf(" "); 159 break; 160 case 6: 161 break; 162 } 163 164 } while (get != 6); 165 system("pause"); 166 return OK; 167 }
实现结果: