代码中主要实现了下面四个操作:
下面几种操作都是线性操作,算法复杂度都是O(n);
- 链表插入默认是按关键字大小插入链表的,所以最后得到的结果是从大到小排好序的,分三种情况(1)链表为空(2)插入的点最小,插在链表最前面;(3)插入链表中间;(4)插入链表结尾。
- 链表删除是在链表中找到要删除的关键字,然后删除该节点,如果有两个以上,只删一个。如果没有就返回。删除操作必须释放删除结点所申请的内存:
- 查找最大理论上就是最后一个,查找最小理论上就是第一个结点。但是我为了通用性写成了遍历整个链表查找最大和最小的结点。(如果找最小直接返回第一个节点算法复杂度为O(1))
- 打印链表,从头到尾打印链表。
主函数中我一函数运行时间为种子生成了一个随机数组,然后一个一个插入链表。
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 }