データ構造-シングルチェーン表の基本操作の実現(すべてのコードを含む)
26617 ワード
著作権声明:本文はブロガーオリジナル文章で、CC 4.0 BY-SA著作権契約に従い、転載は原文の出所リンクと本声明を添付してください.本論文のリンク:https://blog.csdn.net/lady_killer 9/articale/detail/82700723
今日はシングルチェーン表の実現です.主な実現関数は以下の通りです.
コード:
1 /*
2 Project: single linkeed list ( )
3 Date: 2018/09/14
4 Author: Frank Yu
5 InitList(LinkList &L) : L : O(1)
6 ListLength(LinkList L) : L : O(n)
7 ListInsert(LinkList &L,int i,ElemType e) : L, i, e : i O(n)[ ]
8 p O(1)
9 ListDelete(LinkList &L,int i) : L, i : i O(n)[ ]
10 p O(1), , 。
11 O(n), p , p
12 LocateElem(LinkList L,ElemType e) : L, e : e , O(n)
13 */
14 #include
15 #include
16 #include
17 #include
18 #include
19 using namespace std;
20 #define Status int
21 #define ElemType int
22 //
23 typedef struct LNode
24 {
25 ElemType data;//
26 struct LNode *next;//
27 }LNode,*LinkList;
28 //************************** ***************************//
29 //
30 Status InitList(LinkList &L)
31 {
32 L = new LNode;//
33 L->next = NULL;
34 return 1;
35 }
36 // ,
37 int ListLength(LinkList L)
38 {
39 LinkList p=L;int sum=0;
40 while(p)
41 {
42 sum++;
43 p=p->next;
44 }
45 return sum-1;//
46 }
47 // -- i(1<=i<=length+1) i-1 i
48 bool ListInsert(LinkList &L,int i,ElemType e)
49 {
50 LNode* s;LinkList p=L;int j=0;
51 while(p&&(j1 ))//j i-1
52 {
53 p=p->next;
54 ++j;
55 }
56 if(!p||j>i-1)//i<1 i>ListLength(L)+1 , ListLength,
57 {
58 printf(" !!!
");
59 return false;
60 }
61 s=new LNode;
62 s->data=e;
63 s->next=p->next;
64 p->next=s;
65 return true;
66 }
67 // i i-1
68 bool ListDelete(LinkList &L,int i)
69 {
70 LNode* s;LinkList p=L;int j=0;
71 LinkList q;
72 while(p&&(j1))//j i-1
73 {
74 p=p->next;
75 ++j;
76 }
77 if(!(p->next)||j>i-1)//i<1 i>ListLength(L) ,
78 {
79 printf(" !!!
");
80 return false;
81 }
82 q=p->next;
83 p->next=q->next;
84 free(q);//
85 return true;
86 }
87 // e , NULL
88 LNode *LocateElem(LinkList L,ElemType e)
89 {
90 LNode *p=L;
91 while(p&&(p->data!=e))
92 {
93 p=p->next;
94 }
95 return p;
96 }
97 //************************** **************************//
98 //
99 void PrintList(LinkList L)
100 {
101 LinkList p=L->next;//
102 if(ListLength(L))
103 {
104 printf(" :");
105 while(p)
106 {
107 printf("%d ",p->data);
108 p=p->next;
109 }
110 printf("
");
111 }
112 else
113 {
114 printf(" !
");
115 }
116 }
117 // ListInsert
118 void Insert(LinkList &L)
119 {
120 int place;ElemType e;bool flag;
121 printf(" ( 1 ) :
");
122 scanf("%d%d",&place,&e);
123 flag=ListInsert(L,place,e);
124 if(flag)
125 {
126 printf(" !!!
");
127 PrintList(L);
128 }
129 }
130 // ListDelete
131 void Delete(LinkList L)
132 {
133 int place;bool flag;
134 printf(" ( 1 ):
");
135 scanf("%d",&place);
136 flag=ListDelete(L,place);
137 if(flag)
138 {
139 printf(" !!!
");
140 PrintList(L);
141 }
142 }
143 // LocateElem
144 void Search(LinkList L)
145 {
146 ElemType e;LNode *q;
147 printf(" :
");
148 scanf("%d",&e);
149 q=LocateElem(L,e);
150 if(q)
151 {
152 printf(" !
");
153 }
154 else
155 printf(" !
");
156 }
157 //
158 void menu()
159 {
160 printf("********1. 2. *********
");
161 printf("********3. 4. *********
");
162 printf("********5. *********
");
163 }
164 //
165 int main()
166 {
167 LinkList L;int choice;
168 InitList(L);
169 while(1)
170 {
171 menu();
172 printf(" :
");
173 scanf("%d",&choice);
174 if(choice==5) break;
175 switch(choice)
176 {
177 case 1:Insert(L);break;
178 case 2:Delete(L);break;
179 case 3:Search(L);break;
180 case 4:PrintList(L);break;
181 default:printf(" !!!
");
182 }
183 }
184 return 0;
185 }