数据结构 链表
具有基本的增删改查功能的链表
打了一中午 可算完事了……
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 */