单链表基本操作

  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 }

猜你喜欢

转载自www.cnblogs.com/Arvin-JIN/p/8974875.html