单向链表按位置修改
//功能函数
int delete_pos(linklist l,int pos)
{
if(l==NULL||pos<=0||pos>l->len+1)
{
printf("删除失败\n");
return -1;
}
linklist p=l;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
linklist q=p->next;
p->next=q->next;
free(q);
q=NULL;
l->len--;
return 0;
}
//主函数调用结果
1 #include "fun.h"
2 int main(int argc, const char *argv[])
3 {
4 linklist l=create_node(1);
5 int n;
6 datatype e,key;
7 printf("请输入插入元素的个数\n");
8 scanf("%d",&n);
9 for(int i=0;<n;i++)
10 {
11 printf("请输入插入的值");
12 scanf("%d",&e);
13 insert_rear(l,e);
14 }
15 output_linklist(l);
16 printf("请输入要删除的位置:");
17 scanf("%d",&n);
18 delete_pos(l,n);
19 output_linklist(l);
20 linklist_free(l);
21 return 0;
22 }
请输入插入元素的个数
4
请输入插入的值1
请输入插入的值2
请输入插入的值3
请输入插入的值4
1 2 3 4
请输入要删除的位置:2
1 3 4
单向链表按元素删除
//功能函数
int delete_element(linklist l,datatype e)
{
if(l==NULL||l->len==0)
{
printf("按元素删除失败\n");
return -1;
}
linklist p=l;
for(int i=1;i<=l->len;i++)
{
p=p->next;
if(p->data==e)
{
delete_pos(l,i);
return 0;
}
}
return -1;
}
//主函数调用
#include "fun.h"
int main(int argc, const char *argv[])
{
linklist l=create_node(1);
int n;
datatype e,key;
printf("请输入插入元素的个数\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入插入的值");
scanf("%d",&e);
insert_rear(l,e);
}
output_linklist(l);
printf("请输入要删除的元素:");
scanf("%d",&e);
delete_element(l,e);
output_linklist(l);
linklist_free(l);
return 0;
}
//运行结果
请输入插入元素的个数
4
请输入插入的值1
请输入插入的值2
请输入插入的值3
请输入插入的值4
1 2 3 4
请输入要删除的元素:3
1 2 4
单向链表按元素修改
//功能函数
int update_element(linklist l,datatype e,datatype key)//按照元素修改
{
if(l==NULL||l->len==0)
{
printf("按元素修改失败\n");
return -1;
}
int pos=searh_element(l,e);
if(pos==-1)
{
printf("查找不到该元素");
return -1;
}
update_pos(l,pos,key);
return 0;
}
int searh_element(linklist l,datatype e)//查找元素
{
if(l==NULL||l->len==0)
{
printf("按元素查找失败\n");
return -1;
}
linklist p=l;
int pos=1;
while(p->next!=NULL)
{
p=p->next;
if(p->data==e)
return pos;
pos++;
}
return -1;
}
//主函数调用
#include "fun.h"
int main(int argc, const char *argv[])
{
linklist l=create_node(1);
int n;
datatype e,key;
printf("请输入插入元素的个数\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入插入的值");
scanf("%d",&e);
insert_rear(l,e);
}
output_linklist(l);
printf("请输入要查找的元素:");
scanf("%d",&e);
printf("请输入要修改的元素:");
scanf("%d",&key);
update_element(l,e,key);
output_linklist(l);
linklist_free(l);
return 0;
}
//运行结果
请输入插入元素的个数
4
请输入插入的值1
请输入插入的值2
请输入插入的值3
请输入插入的值4
1 2 3 4
请输入要查找的元素:3
请输入要修改的元素:33
1 2 33 4
单向链表在给定元素前插入
//功能函数
int insert_element(linklist l,datatype e,datatype key)
{
if(l==NULL||l->len==0)
{
printf("无法按元素插入\n");
return -1;
}
int pos=searh_element(l,e);
if(pos==-1)
{
printf("找不到该元素\n");
return -1;
}
insert_pos(l,pos,key);
}
int searh_element(linklist l,datatype e)//查找函数
{
if(l==NULL||l->len==0)
{
printf("按元素查找失败\n");
return -1;
}
linklist p=l;
int pos=1;
while(p->next!=NULL)
{
p=p->next;
if(p->data==e)
return pos;
pos++;
}
return -1;
}
//主函数调用
#include "fun.h"
int main(int argc, const char *argv[])
{
linklist l=create_node(1);
int n;
datatype e,key;
printf("请输入插入元素的个数\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入插入的值");
scanf("%d",&e);
insert_rear(l,e);
}
output_linklist(l);
printf("请输入要查找的元素:");
scanf("%d",&e);
printf("请输入要插入的元素:");
scanf("%d",&key);
insert_element(l,e,key);
output_linklist(l);
linklist_free(l);
return 0;
}
//运行结果
请输入插入元素的个数
4
请输入插入的值1
请输入插入的值2
请输入插入的值3
请输入插入的值4
1 2 3 4
请输入要查找的元素:2
请输入要插入的元素:22
1 22 2 3 4
单向链表排序
//功能函数
void sort(linklist l)
{
if(l==NULL||l->len==0)
{
printf("无法排序\n");
return;
}
if(l->len==1)
{
printf("无需排序\n");
return;
}
linklist p=l->next;
for(int i=1;i<l->len;i++)
{
p=l->next;
for(int j=0;j<l->len-i;j++)
{
if((p->data)>p->next->data)
{
datatype temp=p->data;
p->data=(p->next)->data;
(p->next)->data=temp;
}
p=p->next;
}
}
output_linklist(l);
}
//主函数调用
#include "fun.h"
int main(int argc, const char *argv[])
{
linklist l=create_node(1);
int n;
datatype e,key;
printf("请输入插入元素的个数\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入插入的值");
scanf("%d",&e);
insert_rear(l,e);
}
output_linklist(l);
sort(l);
linklist_free(l);
return 0;
}
//运行结果
请输入插入元素的个数
6
请输入插入的值213
请输入插入的值231
请输入插入的值23232
请输入插入的值544
请输入插入的值34
请输入插入的值235
213 231 23232 544 34 235
34 213 231 235 544 23232
单向链表全部释放
void linklist_free(linklist l)
{
if(l==NULL)
return;
for(int i=0;i<l->len;i++)
{
linklist q=l->next;
l->next=q->next;
free(q);
q=NULL;
}
l=NULL;
return;
}