链表数据结构(C/C++语言实现)

注意:没有使用malloc和free;加了一个头文件,用于清屏和暂停;还有就是一个错误特别容易被忽略,那就是主函数中声明了LinkList p,然后就直接创建链表,忘了给p分配空间。一定要先初始化链表再建立。以下代码说白了就是一个个的函数堆出来的,只是要注意函数的参数有时候有引用符&,有时候没有,我总结了一个便于记忆的小技巧:如果你想要对链表做出任何改变,请一定加上&;如果你对链表不想做出改变,就可以不用加,无论你加还是不加,为了保险,可以都加上。如果擅长用指针的话,就忽略从此段话!!!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#include<iostream>
#include<cstdlib>
using  namespace  std;
 
struct  LNode{
     int  data;
     LNode* next;
};
typedef LNode *LinkList;
 
//函数声明
void  show();
void  InitList(LinkList &L);
int  CreateList(LinkList &L, int  n);
int  InsertList(LinkList &L, int  index, int  e);
string  GetElem(LinkList L, int  index, int  &e);
int  deleteList(LinkList &L, int  index, int  &e);
void  PrintList(LinkList L);
 
int  main(){
     int  action,length,index,result,e;
     string  res;
     LinkList L;
     show();
     while (cin>>action){
         switch (action){
 
             case  1: //初始化链表
                 system( "cls" );
                 InitList(L);
                 break ;
 
             case  2: //建立链表
                 system( "cls" );
                 cout<< "请输入链表的长度:" <<endl;
                 cin>>length;
                 result=CreateList(L,length);
                 if (!result){
                     cout<< "创建链表失败!" <<endl;
                 else  {
                     cout<< "创建链表成功!" <<endl;
                 }
                 break ;
 
             case  3: //向链表中插入数据
                 system( "cls" );
                 cout<< "请输入想要插入的位置和插入元素的值:" <<endl;
                 cin>>index>>e;
                 InsertList(L,index,e);
                 break ;
 
             case  4: //获取索引为index的元素值
                 system( "cls" );
                 cout<< "请输入索引:" <<endl;
                 cin>>index;
                 res=GetElem(L,index,e);
                 if (res== "yes" ){
                     cout<< "第" <<index<< "个数是" <<e<<endl;
                 else  {
                     cout<< "未找到该索引的值" <<endl;
                 }
                 break ;
 
             case  5: //删除索引为index的值
                 system( "cls" );
                 cout<< "请输入想要删除的数的索引:" <<endl;
                 cin>>index;
                 deleteList(L,index,e);
                 cout<< "第" <<index<< "个元素已经被删除!" <<endl;
                 break ;
 
             case  6: //打印链表
                 system( "cls" );
                 cout<< "链表内容为:" <<endl;
                 PrintList(L);
                 break ;
 
             case  7: //退出
                 return  0;
         }
         system( "pause" ); //暂停
         system( "cls" ); //清屏
         show();
     }
}
 
//主界面
void  show(){
     cout<< "+----------------------------------------+" <<endl;
     cout<< "|                                        |" <<endl;
     cout<< "|            1->初始化链表               |" <<endl;
     cout<< "|            2->创建链表                 |" <<endl;
     cout<< "|            3->插入结点                 |" <<endl;
     cout<< "|            4->查找结点                 |" <<endl;
     cout<< "|            5->删除节点                 |" <<endl;
     cout<< "|            6->打印链表                 |" <<endl;
     cout<< "|            7->退出                     |" <<endl;
     cout<< "|                                        |" <<endl;
     cout<< "+----------------------------------------+" <<endl;
}
 
//初始化链表
void  InitList(LinkList &L){
     L= new  LNode;
     cout<< "链表初始化成功!" <<endl;
}
 
//创建链表
//尾插法,最先进入的元素在最末尾
//int CreateList(LinkList &L,int n){
//    cout<<"请依次输入结点的值:"<<endl;
//    L->next=NULL;
//    int i;
//    for(i=0;i<n;i++){
//        LinkList p=new LNode;
//        cin>>p->data;
//        p->next=L->next;
//        L->next=p;
//    }
//    if(i!=n){
//        return 0;//失败
//    } else {
//        return 1;//成功
//    }
//}
 
//正序创建,按照输入顺序存储
int  CreateList(LinkList &L, int  length){
     cout<< "请依次输入结点的值:" <<endl;
     LinkList p,q;
     L->next=NULL;
     p=L;
     for ( int  i=0,x;i<length;i++){
         LinkList q= new  LNode;
         cin>>x;
         q->data=x;
         p->next=q;
         p=p->next;
     }
     p->next=NULL;
     return  1;
}
 
 
 
//获取第i个结点的值
string  GetElem(LinkList L, int  i, int  &e){
     LinkList p;
     p=L->next;
     int  j=1;
     while (p&&j<i){
         p=p->next;
         j++;
     }
     if (!p||j>i){
         return  "no" ; //未找到
     }   else  {
         e=p->data;
         return  "yes" ; //找到
     }
}
 
//将值为e的结点插入到第i个位置
int  InsertList(LinkList &L, int  i, int  e){
     LinkList p;
     p=L;
     int  j=0;
     while (p&&j<i-1){
         p=p->next;
         j++;
     }
     if (!p||j>i-1){
         return  0;    //失败
     else  {
         LinkList s= new  LNode;
         s->data=e;
         s->next=p->next;
         p->next=s;
         return  1; //成功
     }
}
 
//删除第i个结点,并将结点的值保存到e中
int  deleteList(LinkList &L, int  i, int  &e){
     LinkList p,q;
     p=L;
     int  j=0;
     while (p->next&&j<i-1){
        p=p->next;
        j++;
     }
     if (!(p->next)&&j>i-1){
         return  0;
     }
     q=p->next;
     p->next=q->next;
     e=q->data;
     delete q; //释放q结点,节约空间
     return  e;
}
 
//打印链表
void  PrintList(LinkList L){
     LinkList p;
     p=L;
     while (p->next){
         p=p->next;
         cout<<p->data<< " " ;
     }
     cout<<endl;
}

猜你喜欢

转载自blog.csdn.net/wang13342322203/article/details/80833724