链表,自己看的,本来想第一个节点处没元素,最后一个节点处差不多跟网上其他人的链表差不多,但是发现不能理解,然后就自己瞎写....竟然还写出了一个奇怪的类似于链表一样的东西....还没写完,近期更新,目前仅供自己查看...
现在完善一点了,然后再看看链表的实现,再完善一下功能,离400来行还差一百来行啊!
挖坟*2.。。还是没完。。。十个功能了
代码:
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> //#include<map> #include<deque> #include<queue> #include<stack> #include<string> #include<iostream> #include<algorithm> using namespace std; #define ll long long #define da 0x3f3f3f3f #define xiao -0x3f3f3f3f #define clean(a,b) memset(a,b,sizeof(a))// 雷打不动的头文件 struct node{ int data; //数据域 node *next; //指针域 }; void createlinked(node *head) { //head=(node*)malloc(sizeof(node));//为head申请一个node大小的空间 int data; cin>>data; //输入数据 head->data=data; //头指针有内容 head->next=NULL; //开始只有它自己 cin>>data; node *can; //定义下一个节点 can=(node *)malloc(sizeof(node));//为下一个节点开辟空间 if(data>0) head->next=can; //第二个数据有意义,第一个节点指向第二个节点 while(data>0) //按要求给数据,现在有意义的数据范围时data>0 { can->data=data; //该节点赋值 cin>>data; //输入下一个节点的值 if(data>0) //符合要求 { node *next; //定义一个新节点并且指向它 next=(node*)malloc(sizeof(node)); can->next=next; can=next; //使该节点等于下一个节点 } else can->next=NULL; //下一个无意义,该节点为最后一个节点,指向空 } } void outputlinked(node *head) { cout<<head->data<<" "; //首先输出头结点的数据 if(head->next==NULL) return ; node *next; next=(node*)malloc(sizeof(node)); next=head->next; //找到下一个节点 while(1) { if(next->next==NULL) //如果这个节点就是最后一个节点了 { cout<<next->data<<endl; //输出对应的数据 break; //结束该任务 } else { cout<<next->data<<" ";//输出对应数据 next=next->next; //找到下一个节点 } } } int lenthlinked(node *head) { int len=1; //我用的这个链表head中是必定有元素的,所以初始长度为1 if(head->next==NULL) return 1; //如果只有一个有意义的数返回1长度 node *can; can=(node*)malloc(sizeof(node)); can=head->next; //从第二个开始找 while(1) { len++; //下一个必定有意义,len++; if(can->next==NULL) //该节点为最后一个节点了,返回长度 return len; else can=can->next; //继续循环 } } int findlinked(node *head,int key) { int place=1; //目前的位置为1 if(head->data==key) //返回这个位置 return place; if(head->next==NULL) //只有一个元素,且不包含目标元素 return 0; //返回0; node *can; can=(node*)malloc(sizeof(node)); can=head->next; //下一个节点开始找 while(1) { place++; //位置++; if(can->data==key) return place; //找到了返回该位置 if(can->next==NULL) return 0; //这是最后一个节点了,且没找到返回0 can=can->next; //继续寻找下一个节点 } } void replacelinked(node *head,int old,int now) { node *can; can=(node*)malloc(sizeof(node)); can=head; while(1) { if(can->data==old) //找到这个节点 { can->data=now; return ; } can=can->next; //每找到继续 } } void removelinked(node *head,int key) { if(head->data==key) //要删除的是第一个元素 { if(head->next!=NULL) //该链表不只有一个节点 { node *can; can=head; head=head->next; //删除该节点 free(can); //将首节点释放 return ; } else { cout<<"删除完毕,当前链表为空!"<<endl; free(head); //释放该链表 return ; } } node *can,*now;//,*next now=(node*)malloc(sizeof(node)); //next=(node*)malloc(sizeof(node)); can=(node*)malloc(sizeof(node)); now=head; can=head->next; //next=can->next; while(1) { if(can->data==key) //找到该节点 { if(can->next==NULL) //该节点是尾节点 { now->next=NULL; //该节点的前驱节点为空 free(can); //释放该节点 break; } now->next=can->next; //不是尾节点,前驱结点指向该节点的后继节点 free(can); break; } now=can; //记录前驱结点 can=can->next; //向后移动一位 } } void insertlinked(node *head,int target,int place,int len) { int i,j; node *now; now=head; for(i=1;i<place;++i) //从第一个节点一直到要插入节点的后一个节点 now=now->next; node *can; can=(node *)malloc(sizeof(node)); if(now->next==NULL) { now->next=can; can->next=NULL; can->data=target; return ; } can->data=target; can->next=now->next; now->next=can; } node* reverselinked(node *head) { if(head->next==NULL) return head; node *pre,*cur,*ne; pre=head; cur=head->next; while(cur) { ne=cur->next; cur->next=pre; pre=cur; cur=ne; } cout<<head<<endl; head->next=NULL; head=pre; cout<<head<<endl; return head; } void emptylinked(node *head) { node *can,*now; now=(node*)malloc(sizeof(node)); can=(node*)malloc(sizeof(node)); can=head; while(1) { cout<<1<<" "; now=can; if(can->next==NULL) { free(now); return ; } can=can->next; free(now); } } /* 10 9 8 7 6 5 4 -1 4 4 5 5 4 6 */ int main() { //1,有一个表头 node head;//表头指向空 (此时其中的元素为0) //2。创建一个链表 cout<<"创建一个链表"<<endl; createlinked(&head);//创建一个链表,将表头所在的地址传过去 //3.查看链表是否创建成功(看一下里面的数据) cout<<"输出该链表"<<endl; outputlinked(&head);//输出该链表中的所以元素 //4.求链表的长度 cout<<"求链表长度"<<endl; int len; len=lenthlinked(&head);//求长度 cout<<"该链表长度为:"<<len<<endl; //5.在链表中查找一个值 cout<<"查找链表中的一个值"<<endl; int target,place=0; cin>>target; place=findlinked(&head,target); //查找链表 if(place) cout<<"find! it place is "<<place<<endl; else cout<<"nofind!"<<endl; //6。替换链表中的某值 cout<<"替换链表中的一个值"<<endl; int old,now; cin>>old>>now; //老数替换成新数 replacelinked(&head,old,now); //替换链表 (必须保证该链表中有被替换的元素) outputlinked(&head); //输出该链表看看是否替换过了; //7.删除元素; cout<<"删除链表中的一个值"<<endl; cin>>target; //输入要删除的目标 removelinked(&head,target); //删除链表(该链表中必须有要删除的元素) outputlinked(&head); //输出对应的列表查看是否删除 len=lenthlinked(&head); //刷新长度 cout<<"now,the lenth of this linked is :"<<len<<endl; //8.插入新节点; cout<<"插入一个x在第y个数的后面(从01开始)"<<endl; cin>>target>>place; insertlinked(&head,target,place,len);//当前采用的方法是place后插入 outputlinked(&head); //查看是否插入成功 //9.反转链表 cout<<"反转链表"<<endl; cout<<&head<<endl; node *temphead=NULL; temphead=reverselinked(&head); //以后的头指针就变成temphead了。。心累。。 cout<<&temphead<<endl; outputlinked(temphead); //10.清空链表 cout<<"清空链表"<<endl; emptylinked(&head); }还是太菜了。。。等等在学点东西继续改吧。。。。
目前运行的结果是这样的: