注意:没有使用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; } |