单链表的创建,删除,插入,排序

///******* 创建单链表
#include<iostream>
using namespace std;


struct student
{
int data;
student *next;
};


student *create(int n)//创建链表
{
student *head,*p,*s;
int x;//要输入的data;
int i=0;//计数
head=(student*)malloc(sizeof(student));
p=head;
while(i++<n)
{
cin>>x;
s=(student*)malloc(sizeof(student));
s->data=x;//按照顺序一个一个插入
p->next=s;
p=s;
}
head=head->next;//把第一个有值的指针设置为头指针
p->next=NULL;//把最后一个指针的下一个指针设置为空指针
return head;
}


int length(student *head)//计算链表的长度
{
int n=0;//记录长度
student *p;
p=head;
while(p!=NULL)
{
p=p->next;//从第一个开始计算
n++;
}
return n;
}


void print(student *head)//打印链表
{
student *p;
p=head;
while(p!=NULL)
{
cout<<p->data<<"  ";
p=p->next;
}
cout<<endl;
}


student *del_1(student *head,int num)//删除某个值为num的结点
{
student *p2,*p1=head;
while(p1->data!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->data==num)
{
if(p1==head)
{
head=p1->next;//把头结点设置为下一个,释放原来的头结点
free(p1);
}
else
{
p2->next=p1->next;
free(p1);
}
}
else
cout<<"没有这个值的结点"<<endl;
return head;
}




student *del_2(student *head,int num)//删除第num个结点
{
if(num>length(head))
{
cout<<"超出范围"<<endl;
exit(0);
}
int i=1;//从第一开始计数
student *p1=head,*p2;
if(num==1)
{
head=head->next;
free(p1);
}
else
{
while(i++<num)//移动到第num个结
{
p2=p1;
p1=p1->next;
}
p2->next=p1->next;
free(p1);
}
return head;
}




student *insert(student *head,int num1,int num2)//在第num1个位置处插入num2这个值
{
student *s;
student *p1=head,*p2;
s=(student *)malloc(sizeof(student));
s->data=num2;
if(num1>length(head)+1)//因为可以再最后面插入一个元素
{
cout<<"超出范围:"<<endl;
exit(0);
}
if(num1==1)
{
s->next=head;
head=s;
}
else
{
int i=1;//计数从第一个结点开始计算
while(i++<num1)
{
p2=p1;
p1=p1->next;
}//寻找到了插入点
s->next=p1;
p2->next=s;
}
return head;
}


student *sort(student *head)//给链表的值排序
{
if(head==NULL||head->next==NULL)
return head;
int n=length(head);//先计算出链表的长度
int temp;//用来做临时变量,交换两个结点的值
student *p;
for(int i=1;i<n;i++)//因为排好了n-1个数的话,那么最后第n个也就排好了
{
p=head;//每次都是从头指针往后开始比较
for(int j=1;j<=n-i;j++)//因为每个指针都有next,则每次在最后需要比较的那个结点的前一个就能够对它进行比较了
{
if(p->data>p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
p=p->next;
}
}
return head;
}




student *insert_1(student *head,int num)//在排好序的链表里面插入一个数,使其继续保持顺序
{
student *s=(student *)malloc(sizeof(student));
s->data=num;
if(s->data<=head->data )
{
s->next=head;
head=s;
}
else
{
student *p1=head,*p2;
while(s->data>p1->data&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(s->data<=p1->data )//在某个结点时,要插入的数不大于这个结点的值,就插入它前面
{
s->next=p1;
p2->next=s;
}
else//否则的话,就是大于最后的那个值了,就直接插入最后
{
s->next=NULL;
p1->next=s;
}
}
return head;
}




student *reverseList(student *head)
{
student *p1,*p2,*p3;
if(head==NULL||head->next==NULL)
return head;
p1=head;
p2=p1->next;
while(p2)
{
p3=p2->next;//用它来保存下一个将逆序的结点
p2->next=p1;//逆序
p1=p2;//向前提了一个
p2=p3;//继续下一个
}
head->next=NULL;
head=p1;
return head;
}


int main(void)
{
int number;
cout<<"输入记录个数:"<<endl;
cin>>number;
student *Head=create(number);


int num=length(Head);
cout<<num<<"个记录如下:"<<endl;
print(Head);//打印输出


cout<<"要删除哪个数:"<<endl;
cin>>number;
Head=del_1(Head,number);
print(Head);


cout<<"要删除第几个数:"<<endl;
cin>>number;
Head=del_2(Head,number);
print(Head);


int number1,number2;
cout<<"要在第几个数插入哪个数:"<<endl;
cin>>number1>>number2;
Head=insert(Head,number1,number2);
print(Head);


cout<<"排序后:"<<endl;
Head=sort(Head);
print(Head);


cout<<"请输入要在排序后插入的数:"<<endl;
cin>>number;
Head=insert_1(Head,number);
print(Head);


cout<<"逆序后:"<<endl;
Head=reverseList(Head);
print(Head);


return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值