数据结构 链表

 具有基本的增删改查功能的链表

打了一中午 可算完事了……

  1 #include<stdio.h>
  2 #include<string.h>
  3 /**********************************************
  4  仅仅是完成了基本的增删改查还有普通的查询工作
  5  有些地方还不具有健壮性 会慢慢修改
  6  最后有代码的样例输入用来调试程序
  7 ***********************************************/
  8 struct _list{ //链表
  9     int value;
 10     _list *next;
 11     _list(){ //初始化
 12         value=0;
 13         next=NULL;
 14     }
 15 };
 16 
 17 int _size(_list *&node){ //计算链表长度
 18     if(node->next==NULL) return 0;
 19     _list *used=node->next;
 20     int sum=1;
 21     while(true){
 22         if(used->next==NULL) break;
 23         else{
 24             sum++;
 25             used=used->next;
 26         }
 27     }
 28     return sum;
 29 }
 30 
 31 void add(_list *&node,int value){ //向链表末尾添加值为value的节点
 32     if(node==NULL){
 33         node=new _list();
 34         node->value=value;
 35         node->next=NULL;
 36     }
 37     else add(node->next,value);
 38 }
 39 
 40 _list *_find(_list *&node,int local){ //寻找local位置的节点
 41     _list *used=node->next;
 42     int l=1;
 43     while(l<local){
 44         used=used->next;
 45         l++;
 46     }
 47     return used;
 48 }
 49 
 50 int find_value(_list *&node,int value){ //寻找值为value的节点的位置 如果没有返回-1
 51     _list *used=node;
 52     int l=0,ans=-1;
 53     int __size=_size(node);
 54     while(l<=__size){
 55         if(used->value==value){
 56             ans=l;
 57             break;
 58         }
 59         used=used->next;
 60         l++;
 61     }
 62     return ans;
 63 }
 64 
 65 void _insert(_list *&node,int local,int value){ //向local位置插入一个值为value的节点
 66     _list *used=_find(node,local-1);
 67     _list *now=used->next;
 68     _list *__list=new _list();
 69     __list->next=now;
 70     __list->value=value;
 71     used->next=__list;
 72 }
 73 
 74 void change(_list *&node,int local,int value){ //将local位置的节点的值赋为value
 75     _list *used=_find(node,local);
 76     used->value=value;
 77 }
 78 
 79 void _delete(_list *&node,int local){ //删除local位置的节点
 80     _list *_front=_find(node,local-1);
 81     _list *now=_find(node,local);
 82     _front->next=now->next;
 83     delete(now);
 84 }
 85 
 86 void print(_list *&node){ //打印整个链表
 87     if(node->next==NULL){
 88         printf("default\n");
 89         return ;
 90     }
 91     _list *used=node->next;
 92     printf("%d",used->value);
 93     used=used->next;
 94     while(used!=NULL){
 95         printf(" %d",used->value);
 96         used=used->next;
 97     }
 98     printf("\n");
 99     return ;
100 }
101 
102 void destroy(_list *&node){ //销毁整个链表
103     _list *used=node->next;
104     node->next=NULL;
105     if(used==NULL)
106         printf("default\n");
107     else{
108         int __size=_size(node);
109         for(int i=1;i<=__size;i++)
110             _delete(node,i);
111     }
112 }
113 
114 int _empty(_list *&node){ //询问链表是否为空
115     if(node->next==NULL) return 1;
116     else return 0;
117 }
118 
119 void _clear(_list *&node){ //清空整个链表
120     _list *used=node->next;
121     node->value=-1;
122     while(used!=NULL){
123         used->value=-1;
124         used=used->next;
125     }
126 }
127 
128 int main(){
129     char act[20];
130     int local,value;
131     _list *node=new _list();
132     while(scanf("%s",act)!=EOF){
133         if(strcmp(act,"end")==0) break;
134         if(strcmp(act,"print")==0) print(node);
135         if(strcmp(act,"clear")==0) _clear(node);
136         if(strcmp(act,"destory")==0) destroy(node);
137         if(strcmp(act,"add")==0){
138             scanf("%d",&value);
139             add(node,value);
140         }
141         if(strcmp(act,"delete")==0){
142             scanf("%d",&local);
143             _delete(node,local);
144         }
145         if(strcmp(act,"size")==0){
146             printf("%d\n",_size(node));
147         }
148         if(strcmp(act,"insert")==0){
149             scanf("%d%d",&local,&value);
150             _insert(node,local,value);
151         }
152         if(strcmp(act,"change")==0){
153             scanf("%d%d",&local,&value);
154             change(node,local,value);
155         }
156         if(strcmp(act,"find")==0){
157             scanf("%d",&local);
158             if(local>_size(node)) printf("default\n");
159             else printf("%d\n",_find(node,local)->value);
160         }
161         if(strcmp(act,"find_value")==0){
162             scanf("%d",&value);
163             int val=find_value(node,value);
164             if(val==-1) printf("none\n");
165             else printf("%d\n",val);
166         }
167 
168         if(strcmp(act,"empty")==0){
169             if(_empty(node)) printf("empty\n");
170             else printf("not empty\n");
171         }
172     }
173     return 0;
174 }
175 /*
176 
177 add 1
178 add 2
179 add 3
180 add 4
181 empty
182 print
183 delete 2
184 print
185 insert 3 100
186 print
187 empty
188 find_value 3
189 find 3
190 
191 */

 

posted @ 2016-10-10 12:54  良将ℓ  阅读(302)  评论(0编辑  收藏  举报