链表边遍历边删除,需要从后面往前进行遍历删除,才可以正确,如果从前往后遍历删除,会导致删除的位置不对,比如1 2 3 4 5,要删除能下标被2整除的元素,如果从前往后删,会删除2,5的,因为删除了2之后,3会往前移动这样4的位置就变为5,所以删的不对,从后往前删,会依次删除4,2
代码:
#include <iostream>
#include <string>
using namespace std;
typedef struct Node{
int data;
struct Node *next;
};
//创建链表(尾插法)
void create_list(Node *&L){
Node *p=L,*s;
p->next=NULL;//创建头结点
int x;
while(1){
cin>>x;
if(x==-1){
break;
}
s=new Node;
s->data=x;
p->next=s;
p=s;
}
p->next=NULL;
}
//插入链表
int insert_list(Node *&L,int i,int e){
Node *p=L;
int j=0;//统计p的位置,插入需要知道i的前一个元素就是j
while(p&&j<i-1){ //需要知道前一个元素是否存在
p=p->next;
j++;
}
if(!p||j>i-1){
cout<<"插入错误"<<endl;
return 0;
}
Node *s=new Node;
s->data=e;
s->next=p->next;
p->next=s;
cout<<"插入成功"<<endl;
}
//删除元素
int delete_list(Node *&L,int i){
Node *p=L;
int j=0;//删除第i个位置的元素,需要知道前一个元素的节点,
while(p->next&&j<i-1){ //删除需要知道下一个元素是否存在,所以p->next
p=p->next;
j++;
}
if(!(p->next)||j>i-1){
cout<<"删除错误"<<endl;
return 0;
}
Node *q=p->next;
p->next=q->next;
delete q;
cout<<"删除成功"<<endl;
}
//得到第i个元素
int get_list(Node *&L,int i){
Node *p=L->next;
int j=1;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i){
cout<<"得到错误"<<endl;
return 0;
}
cout<<p->data<<endl;
}
//删除所有元素
void delete_all_list(Node *&L){
Node *p=L;;
while(p->next!=NULL){
Node *q=p->next;
p->next=q->next;
}
}
//展示链表中的元素
void show(Node *&L){
Node *p=L->next;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//链表的长度
int len(Node *&L){
Node *p=L;
if(p->next==NULL){
cout<<0<<endl;
return 0;
}
int sum=0;
p=p->next;
while(p!=NULL){
sum++;
p=p->next;
}
cout<<sum<<endl;
}
//链表排序
void sort_list(Node *&G){
Node *p=G,*l=p->next,*pre;
Node *r=l->next;
l->next=NULL;
l=r;
while(l!=NULL){
r=l->next;
pre=p;
while(pre->next!=NULL&&pre->next->data<l->data){
pre=pre->next;
}
l->next=pre->next;
pre->next=l;
l=r;
}
show(G);
}
int main()
{
Node *L=new Node;
int i,e;
string s;
//链表的一些操作
while(1){
cout<<"*******************************************************************"<<endl;
cout<<"1,创建create_list,当输入-1的时候链表创建完毕!"<<endl;
cout<<"2,插入insert_list"<<endl;
cout<<"3,删除delete_list"<<endl;
cout<<"4,得到元素get_list"<<endl;
cout<<"5,删除所有元素delete_all_list"<<endl;
cout<<"6,展示链表元素show"<<endl;
cout<<"7,链表长度len"<<endl;
cout<<"8,链表排序sort_list"<<endl;
cout<<"*******************************************************************"<<endl;
cin>>s;
if(s=="1"){
//创建
create_list(L);
}else if(s=="2"){
//在i位置插入e
cout<<"输入i和e:";
cin>>i>>e;
insert_list(L,i,e);
}else if(s=="3"){
//在i位置删除
cout<<"输入i:";
cin>>i;
delete_list(L,i);
}else if(s=="4"){
//得到第i个位置的元素
cout<<"输入i:";
cin>>i;
get_list(L,i);
}else if(s=="5"){
//删除
delete_all_list(L);
}else if(s=="6"){ //展示
show(L);
}else if(s=="7"){ //求长度
len(L);
}else if(s=="8"){ //从小到大排序
sort_list(L);
}else{
continue;
}
}
return 0;
}