单链表基本操作
1 //单链表基本操作 2 #include <iostream> 3 using namespace std; 4 5 //#define ElemType int 6 typedef int ElemType; 7 8 typedef struct LNode { 9 ElemType data; 10 struct LNode *next; // (递归定义) 指向后继节点 11 }LinkList; 12 13 //头插法建表 14 void CreateListF(LinkList *&List, ElemType a[], int n) { 15 LinkList *s; 16 List = (LinkList *)malloc(sizeof(LinkList)); 17 List->next = NULL; 18 for (int i = 0; i < n; i++) { 19 s = (LinkList*)malloc(sizeof(LinkList)); 20 s->data = a[i]; 21 s->next = List->next; 22 List->next = s; 23 } 24 } 25 26 27 //尾插法建表 28 void CreateListR(LinkList *&List, ElemType a[], int n) { 29 LinkList *s, *r; 30 List = (LinkList *)malloc(sizeof(LinkList)); 31 r = List; 32 List->next = NULL; 33 for (int i = 0; i < n; i++) { 34 s = (LinkList *)malloc(sizeof(LinkList)); 35 s->data = a[i]; 36 r->next = s; 37 r = s; 38 } 39 r->next = NULL; 40 } 41 42 //初始化单链表 43 void InitList(LinkList *&list) { 44 list = (LinkList *)malloc(sizeof(LinkList)); 45 list->next = NULL; 46 } 47 48 //销毁单链表 49 void DestroyList(LinkList *&list) { 50 LinkList *p = list, *q = list->next; 51 while (q != NULL) { 52 free(p); 53 p = q; 54 q = q->next; 55 } 56 free(p); 57 } 58 59 //判断单链表是否为空 60 bool ListEmpty(LinkList *list) { 61 return (list->next == NULL); 62 } 63 64 //求单链表的长度 65 int ListLength(LinkList *list) { 66 int n = 0; 67 LinkList * p = list; 68 while (p->next) { 69 n++; 70 p = p->next; 71 } 72 return n; 73 } 74 75 //输出单链表 76 void DispList(LinkList *list) { 77 LinkList *p = list->next; 78 while (p != NULL) { 79 cout << p->data << " "; 80 p = p->next; 81 } 82 cout << endl; 83 } 84 85 //求单链表中某值元素的位置 86 int LocateElem(LinkList *list, ElemType e) { 87 int i = 1; 88 LinkList *p = list ->next; 89 while (p != NULL && p->data != e) { 90 i++; 91 p = p->next; 92 } 93 if (p == NULL) 94 return (0); 95 else 96 return (i); 97 } 98 99 100 101 //求单链表中某个位置元素的值 102 bool GetElem(LinkList*list, int i, ElemType &e) { 103 LinkList * p = list; 104 int j = 0; 105 while (j < i && p->next != NULL) { 106 j++; 107 p = p->next; 108 } 109 if (p == NULL) 110 return false; 111 else { 112 e = p->data; 113 return true; 114 } 115 } 116 117 118 //插入数据元素 119 bool ListInsert(LinkList *&list, int i, ElemType e) { 120 int j = 0; 121 LinkList *p = list, *s; 122 while (j < i - 1 && p != NULL) { 123 j++; 124 p = p->next; 125 } 126 if (p == NULL) 127 return false; 128 else { 129 s = (LinkList *)malloc(sizeof(LinkList)); 130 s->data = e; 131 s->next = p->next; 132 p->next = s; 133 return true; 134 } 135 136 137 } 138 139 //删除数据元素 140 bool ListDelete(LinkList *&list, int i, ElemType &e) { 141 int j = 0; 142 LinkList *p = list, *q; 143 while (j < i - 1 && p != NULL) { 144 j++; 145 p = p->next; 146 } 147 if (p == NULL) 148 return false; 149 else { 150 q = p->next; 151 if (q == NULL) 152 return false; 153 e = q->data; 154 p->next = q->next; 155 free(q); 156 return true; 157 } 158 } 159 160 161 int main() { 162 const int n = 7; 163 int a[n]; 164 cout << "Input " << n << " numbers:"; 165 for (int i = 0; i < n; i++) { 166 cin >> a[i]; 167 } 168 LinkList *lista, *listb; 169 InitList(lista); 170 InitList(listb); 171 CreateListF(lista, a, n); 172 cout << "Input " << n << " numbers:"; 173 for (int i = 0; i < n; i++) { 174 cin >> a[i]; 175 } 176 CreateListR(listb, a, n); 177 cout << "头插法(lista):"; 178 DispList(lista); 179 cout << "尾插法(listb):"; 180 DispList(listb); 181 DestroyList(listb); 182 cout << endl << endl; 183 184 int len = ListLength(lista); 185 cout << "Lista的长度" << len << endl; 186 cout << endl << endl; 187 188 189 int m; 190 cout << "输入要查询的元素的值(lista):" ; 191 cin >> m; 192 int loca = LocateElem(lista, m); 193 cout << m << "第一次出现在" << loca << "位置" << endl; 194 cout << endl << endl; 195 196 197 cout << "输入要查询的元素的位置(lista):"; 198 cin >> loca; 199 GetElem(lista, loca, m); 200 cout << "第" << loca << "个元素的值为" << m<< endl; 201 cout<< endl << endl; 202 203 204 cout << "输入要插入的位置和数值(lista):"; 205 cin >> loca >> m; 206 if (ListInsert(lista, loca, m)) 207 DispList(lista); 208 else 209 cout << "插入失败!" << endl; 210 cout << endl << endl; 211 212 cout << "输入要删除的位置(lista):"; 213 cin >> loca; 214 if (ListDelete(lista, loca, m)) { 215 cout << "删除的元素值为" << m << endl << "更新后的链表为:"; 216 DispList(lista); 217 cout << endl << endl; 218 } 219 else cout << "删除失败!" << endl; 220 DestroyList(lista); 221 }