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

代码中主要实现了下面四个操作:

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

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

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

  1 #include<iostream>
  2 #include<time.h>
  3 using namespace std;
  4 #define N 100
  5 struct list{
  6     int val;
  7     list* next;
  8 };
  9 list *temp=NULL,*head=NULL;
 10 int insertlist(int data){
 11     temp=new list;//临时结点保存要插入的值,
 12                   //每次重新申请空间,因为在外面定义,全局变量
 13                   //所以不用担心申请的空间在函数结束时被系统销毁
 14     temp->val=data;
 15     if(head==NULL){//如果链表中没有值的时候
 16         temp->next=NULL;
 17         head=temp;
 18         return 0;
 19     }
 20     list* node=new list;//记录用来与插入值对比的下一个节点,
 21                         //必须新申请空间,因为指向地址不停在变,
 22                         //不申请的话头指针所指向地址也跟着变
 23                         //局部变量,函数返回时自动销毁所申请内存
 24     list* nodelast;//记录node上一个节点,可以不用申请新内存
 25     node=head;
 26     while(node){
 27         if(data<head->val){//如果插入第一个
 28             temp->next=head;//把当前头节点的地址赋给临时变量的下一个
 29             head=temp;//把头指针换为新结点
 30             return 0;
 31         }
 32         else if(data<node->val){//如果在中间插入
 33             temp->next=node;
 34             nodelast->next=temp;//node上一个节点指向新插入的节点
 35             return 0;
 36         }
 37         else{
 38             nodelast=node;
 39             node=node->next;
 40         }
 41     }
 42     temp->next=NULL;//在最后插入
 43     nodelast->next=temp;
 44     return 0;
 45 }
 46 int deletelist(int data)
 47 {
 48     if(head==NULL)
 49     {
 50         cout<<"链表为空"<<endl;
 51         return 0;
 52     }
 53     if(head->val==data)
 54     {
 55         list *t=NULL;
 56         t=head;
 57         head=head->next;
 58         delete t;
 59         return 0;
 60     }
 61     temp=new list;
 62     temp=head;
 63     while(temp->next)
 64     {
 65         if(temp->next->val==data)
 66         {
 67             list *t=NULL;
 68             t=temp->next;
 69             temp->next=temp->next->next;
 70             delete t;
 71             return 0;
 72         }
 73         temp=temp->next;
 74     }
 75     cout<<"链表中没有"<<data<<endl;
 76     return 0;
 77 }
 78 int findmax()
 79 {
 80     int max=0;
 81     if(head==NULL)
 82     {
 83         cout<<"链表为空"<<endl;
 84         return 0;
 85     }
 86     temp=new list;
 87     temp=head;
 88     while(temp)
 89     {
 90         if(temp->val>max){
 91             max=temp->val;
 92         }
 93         temp=temp->next;
 94     }
 95     return max;
 96 }
 97 int findmin()
 98 {
 99     int min=65565;
100     if(head==NULL)
101     {
102         cout<<"链表为空"<<endl;
103         return 0;
104     }
105     temp=new list;
106     temp=head;
107     while(temp)
108     {
109         if(temp->val<min){
110             min=temp->val;
111         }
112         temp=temp->next;
113     }
114     return min;
115 }
116 int printlist()
117 {
118     list* node=new list;//子
119     node=head;
120     while(node){
121         cout<<node->val;
122         if(node->next)
123             cout<<"->";
124         node=node->next;
125     }
126     cout<<endl;
127     return 0;
128 }
129 int main()
130 {
131     int number[N],j,t;
132     for(int i=0;i<N;i++)
133         number[i]=i;
134     srand((unsigned)time(NULL));
135     for(int i=0;i<N;i++)//随机生成1到N的数组
136     {
137         j=rand()%N;
138         t=number[i];
139         number[i]=number[j];
140         number[j]=t;
141     }
142     cout<<"插入前:";
143     for(int i=0;i<N;i++)
144     {
145         cout<<number[i];
146         if(i<N)
147             cout<<"->";
148     }
149     cout<<endl<<endl<<"插入后:";
150     for(int i=0;i<N;i++)
151     {
152         insertlist(number[i]);
153     }
154     deletelist(99);
155     deletelist(0);
156     printlist();
157     cout<<endl<<endl<<"链表中最大值为:"<<findmax()<<endl;
158     cout<<endl<<endl<<"链表中最小值为:"<<findmin()<<endl;
159     return 0;
160 }
时间: 2024-10-10 09:23:26

链表及其各种函数操作的实现方法的相关文章

链表《2》使用函数操作链表

使用函数操作链表 1:计算链表中结点的个数:定义一个Length_list()函数用于计算链表中结点的个数 函数代码: //计算链表中结点的个数 void Length_list(PNODE pHead) { PNODE p = pHead->pNext; int len = 0; while(NULL != p) { len++; p = p->pNext; } printf("这条链表中有%d个结点\n",len); } 2判断链表是否为空:定义一个Is_empty()

List (单链表17个函数讲解)

链表时一种常用的数据结构,是通过"链"来建立起数据元素之间的逻辑关系,这种用链接方式储存的线性表简称链表(Link List). 一,链表与顺序表的对比 在接触链表之前大家想必已经了解过了顺序表的储存结构方式,顺序表与链表的不同之处如下: 1.顺序表是物理位置上相邻来表示数据元素之间的逻辑关系:但链表不是,物理地址不相连,通过指针来链接. 2.顺序表储存密度高,且能够随机的存取数据(通过下标):但链表不能随机访问,只能通过头指针遍历到指定节点遍历,这点没有顺序表方便. 3.顺序表插入删

常用的操作正则表达式的方法+正则表达式基本元字符使用实例

常用的操作正则表达式的方法: 下面学习一下位于System.Text.RegularExpressions下的Regex类的一些静态方法和委托(只要有一段匹配就会返回true) 1,静态方法IsMatch (返回值是一个布尔类型,用于判断指定的字符串是否与正则表达式字符串匹配,它有三个重载方法) bool IsMatch(string input, string pattern); 参数: input: 要搜索匹配项的字符串. pattern: 要匹配的正则表达式模式. 返回结果: 如果正则表达

一些ES5的操作数组的方法

在ES5规范中新增了不少操作数组的方法,特此罗列一下以备使用 1. forEach循环 有点类似jQuery的each循环 [12,23,36,4,5].forEach(function(v,k){ console.log(v)   得到元素值,    12,23,36,4,5 console.log(k)   得到元素下标 ,0,1,2,3,4 }) 方便在不借助三方库的情况下遍历各类数组 2.filter过滤器 用于筛选元素 var arr = [12,23,36,4,5].filter(f

Java数组操作十大方法

0.定义一个Java数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c", "d", "e"}; String[] cArray = new String[]{"a","b","c","d","e"}; 第一种是定义了一个数组,并

JS 操作数组的方法

1.检测数组 (判断一个值是不是数组) var color = ["red", "green", "blue"]; (1) if (color instanceof Array) {} (2) if (Array.isArray(value)) {} 2.转换方法 var color = ["red", "green", "blue"]; (1) toString()/toLocalSt

静态链表的实现与操作(C语言实现)

我们知道要实现单链表,必须要有指针,那么像Java这样没有指针的的语言就略显蛋疼了. 没关系,我们有静态链表,其本质就是用采用数组的方式实现单链表的功能. 头文件: #ifndef _StaticLinkList_H_ #define _StaticLinkList_H_ typedef void StaticLinkList; typedef void StaticLinkListNode; StaticLinkList * StaticLinkList_Create(int capacity

用ADO操作数据库的方法步骤(ZT)

http://www.cppblog.com/changshoumeng/articles/113437.html 学习ADO时总结的一些经验 用ADO操作数据库的方法步骤 ADO接口简介 ADO库包含三个基本接口:_ConnectionPtr接口._CommandPtr接口和_RecordsetPtr接口. _ConnectionPtr接口返回一个记录集或一个空指针. 通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程.使用_ConnectionPtr接口返回一个

JqGrid相关操作备忘 方法列表

JqGrid相关操作备忘 方法列表 1.获得当前列表行数:$("#gridid").getGridParam("reccount"); 2.获取选中行数据(json):$("#gridid").jqGrid('getRowData', id); 3.刷新列表:$(refreshSelector).jqGrid('setGridParam', { url: ''), postData: ''}).trigger('reloadGrid'); 4.选