您的位置:首页 > 编程语言 > C语言/C++

链表及其各种函数操作的实现方法

2016-11-21 16:52 423 查看
代码中主要实现了下面四个操作:

下面几种操作都是线性操作,算法复杂度都是O(n);

链表插入默认是按关键字大小插入链表的,所以最后得到的结果是从大到小排好序的,分三种情况(1)链表为空(2)插入的点最小,插在链表最前面;(3)插入链表中间;(4)插入链表结尾。
链表删除是在链表中找到要删除的关键字,然后删除该节点,如果有两个以上,只删一个。如果没有就返回。删除操作必须释放删除结点所申请的内存:
查找最大理论上就是最后一个,查找最小理论上就是第一个结点。但是我为了通用性写成了遍历整个链表查找最大和最小的结点。(如果找最小直接返回第一个节点算法复杂度为O(1))
打印链表,从头到尾打印链表。

主函数中我一函数运行时间为种子生成了一个随机数组,然后一个一个插入链表。

#include<iostream>
#include<time.h>
using namespace std;
#define N 100
struct list{
int val;
list* next;
};
list *temp=NULL,*head=NULL;
int insertlist(int data){
temp=new list;//临时结点保存要插入的值,
//每次重新申请空间,因为在外面定义,全局变量
//所以不用担心申请的空间在函数结束时被系统销毁
temp->val=data;
if(head==NULL){//如果链表中没有值的时候
temp->next=NULL;
head=temp;
return 0;
}
list* node=new list;//记录用来与插入值对比的下一个节点,
//必须新申请空间,因为指向地址不停在变,
//不申请的话头指针所指向地址也跟着变
//局部变量,函数返回时自动销毁所申请内存
list* nodelast;//记录node上一个节点,可以不用申请新内存
node=head;
while(node){
if(data<head->val){//如果插入第一个
temp->next=head;//把当前头节点的地址赋给临时变量的下一个
head=temp;//把头指针换为新结点
return 0;
}
else if(data<node->val){//如果在中间插入
temp->next=node;
nodelast->next=temp;//node上一个节点指向新插入的节点
return 0;
}
else{
nodelast=node;
node=node->next;
}
}
temp->next=NULL;//在最后插入
nodelast->next=temp;
return 0;
}
int deletelist(int data)
{
if(head==NULL)
{
cout<<"链表为空"<<endl;
return 0;
}
if(head->val==data)
{
list *t=NULL;
t=head;
head=head->next;
delete t;
return 0;
}
temp=new list;
temp=head;
while(temp->next)
{
if(temp->next->val==data)
{
list *t=NULL;
t=temp->next;
temp->next=temp->next->next;
delete t;
return 0;
}
temp=temp->next;
}
cout<<"链表中没有"<<data<<endl;
return 0;
}
int findmax()
{
int max=0;
if(head==NULL)
{
cout<<"链表为空"<<endl;
return 0;
}
temp=new list;
temp=head;
while(temp)
{
if(temp->val>max){
max=temp->val;
}
temp=temp->next;
}
return max;
}
int findmin()
{
int min=65565;
if(head==NULL)
{
cout<<"链表为空"<<endl;
return 0;
}
temp=new list;
temp=head;
while(temp)
{
if(temp->val<min){
min=temp->val;
}
temp=temp->next;
}
return min;
}
int printlist()
{
list* node=new list;//子
node=head;
while(node){
cout<<node->val;
if(node->next)
cout<<"->";
node=node->next;
}
cout<<endl;
return 0;
}
int main()
{
int number
,j,t;
for(int i=0;i<N;i++)
number[i]=i;
srand((unsigned)time(NULL));
for(int i=0;i<N;i++)//随机生成1到N的数组
{
j=rand()%N;
t=number[i];
number[i]=number[j];
number[j]=t;
}
cout<<"插入前:";
for(int i=0;i<N;i++)
{
cout<<number[i];
if(i<N)
cout<<"->";
}
cout<<endl<<endl<<"插入后:";
for(int i=0;i<N;i++)
{
insertlist(number[i]);
}
deletelist(99);
deletelist(0);
printlist();
cout<<endl<<endl<<"链表中最大值为:"<<findmax()<<endl;
cout<<endl<<endl<<"链表中最小值为:"<<findmin()<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 c++