aa单链表的操作:
1> 单链表节点的创建
2> 单链表头插
3> 单链表遍历
4> 单链表尾插
5> 单链表头删
6> 单链表尾删
7> 单链表按位置插入
8> 单链表按位置删除
9> 单链表按位置修改
10> 单链表按位置查找
11> 单链表按元素查找
12> 单链表按元素删除
13> 单链表按元素修改
14> 单链表逆置
15> 单链表排序
16> 单链表查找倒数第n个节点
17> 单链表释放空间
18> 计算链表长度
代码:
主函数:
#include"head.h"
int main(int argc, const char *argv[])
{
linklist l=NULL;
int n,num;
printf("请输入头插的个数:\n");
scanf("%d",&n);
printf("请输入头插的数;\n");
for(int i=0;i<n;i++)
{
scanf("%d",&num);
l=insert_head(l,num);
}
output(l);
printf("请输入头删的个数;\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
l=delete_head(l);
}
output(l);
printf("请输入尾插的个数:\n");
scanf("%d",&n);
printf("请输入尾插的数\n");
for(int i=0;i<n;i++)
{
scanf("%d",&num);
l=insert_t(l,num);
}
output(l);
printf("请输入插入的位置:\n");
scanf("%d",&n);
printf("请输入插入的值:\n");
scanf("%d",&num);
l=insert_i(l,n,num);
output(l);
printf("请输入删除的位置:\n");
scanf("%d",&n);
l=delete_i(l,n);
output(l);
printf("请输入修改的位置和值:\n");
scanf("%d%d",&n,&num);
revise_i(l,n,num);
output(l);
int m=0,x=0;
printf("请输入要查找的元素:\n");
scanf("%d",&num);
m=search_n(l,num);
printf("查找到的元素位置:%d\n",m);
printf("请输入要修改的元素以及修改成的元素:\n");
scanf("%d%d",&num,&x);
revise_n(l,num,x);
output(l);
printf("请输入要删除的元素:\n");
scanf("%d",&num);
delete_n(l,num);
output(l);
l=nizhi(l);
output(l);
printf("请输入查找倒数第n个数:\n");
scanf("%d",&n);
search(l,n);
output(l);
l=sort(l);
output(l);
free_space(l);
return 0;
}
头文件
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}node,*linklist;
linklist insert_head(linklist l,int num);
linklist create_note();
linklist delete_head(linklist l);
void output(linklist l);
linklist insert_t(linklist l,int num);
linklist delete_t(linklist l);
int lend(linklist l);
linklist insert_i(linklist l,int n,int num);
linklist delete_i(linklist l,int n);
void revise_i(linklist l,int n,int num);
void search_i(linklist l,int n);
int search_n(linklist l,int num);
linklist delete_n(linklist l,int num);
linklist nizhi(linklist l);
linklist free_space(linklist l);
void search(linklist l,int n);
linklist sort(linklist l);
void revise_n(linklist l,int num,int x);
#endif
自定义函数
:
#include"head.h"
//创建节点
linklist create_note()
{
linklist s=(linklist)malloc(sizeof(node));
if(NULL==s)
return NULL;
s->next=NULL;
return s;
}
//头插
linklist insert_head(linklist l,int num)
{
linklist s=create_note();
if(l==NULL)
{
s->data=num;
l=s;
}
else
{
s->next=l->next;
l->next=s;
s->data=l->data;
l->data=num;
}
return l;
}
//头删
linklist delete_head(linklist l)
{
if(l==NULL)
return l;
else if(l->next==NULL)
{
free(l);
l=NULL;
}
else
{
linklist s=create_note();
s=l->next;
l->data=s->data;
l->next=s->next;
free(s);
s=NULL;
}
return l;
}
//尾插
linklist insert_t(linklist l,int num)
{
linklist s=create_note();
linklist n=create_note();
s->data=num;
if(NULL==l)
{
l=s;
}
else
{
n=l;
while(n->next!=NULL)
{
n=n->next;
}
}
n->next=s;
return l;
}
//尾删
linklist delete_t(linklist l)
{
if(NULL==l)
return NULL;
else if(l->next=NULL)
{
free(l);
l=NULL;
}
else
{
linklist q=l;
while(q->next->next!=NULL)
{
q=q->next;
}
q=q->next;
free(q);
q=NULL;
}
return l;
}
//按位置插入
linklist insert_i(linklist l,int n,int num)
{
int len=lend(l);
linklist s=create_note();
s=l;
if(n<=len+1&&n>0)
{
linklist p=create_note();
if(NULL==l||n==1)
{
s=insert_head(l,num);
}
else if(n<=len)
{
for(int i=1;i<n;i++)
{
s=s->next;
}
p->next=s->next;
s->next=p;
p->data=s->data;
s->data=num;
}
else
{
s=insert_t(l,num);
}
}
return l;
}
//按位置删除(重点看)
linklist delete_i(linklist l,int n)
{
int len=lend(l);
if(NULL==l)
return NULL;
if(n<1||n>len)
return l;
else if(n==1)
{
l=delete_head(l);
}
else
{ linklist s=l;
for(int i=1;i<n-1;i++)
{
s=s->next;
}
linklist p=s->next;
s->next=p->next;
free(p);
p=NULL;
}
return l;
}
//按位置修改
void revise_i(linklist l,int n,int num)
{
int len=lend(l);
if(NULL==l||n<1||n>len)
return;
else
{
linklist s=l;
for(int i=1;i<n;i++)
{
s=s->next;
}
s->data=num;
}
return;
}
//按位置查找
void search_i(linklist l,int n)
{
int len=lend(l);
if(NULL==l||n<1||n>len)
return;
else
{
linklist s=l;
for(int i=1;i<n;i++)
{
s=s->next;
}
printf("%d",s->data);
}
return;
}
//按元素查找
int search_n(linklist l,int num)
{
int n=1;
if(NULL==l)
return -1;
else
{
linklist s=l;
while(NULL!=s)
{
if(num==s->data)
{
return n;
}
s=s->next;
n++;
}
}
return -1;
}
//按元素修改
void revise_n(linklist l,int num,int x)
{
int n=search_n(l,num);
if(-1==n)
{
puts("error");
return;
}
else
{
linklist s=l;
for(int i=1;i<n;i++)
{
s=s->next;
}
s->data=x;
}
return;
}
//按元素删除
linklist delete_n(linklist l,int num)
{
int n=search_n(l,num);
if(-1==n)
return l;
else
{
linklist s=l;
for(int i=1;i<n-1;i++)
s=s->next;
linklist p=s->next;
s->next=p->next;
free(p);
p=NULL;
}
return l;
}
//逆置
linklist nizhi(linklist l)
{
if(NULL==l||NULL==l->next)
return l;
else
{
linklist s=l->next;
l->next=NULL;
while(s!=NULL)
{
linklist p=s;
s=s->next;
p->next=l;
l=p;
}
}
return l;
}
//查找倒数第n个
void search(linklist l,int n)
{
if(NULL==l||NULL==l->next)
return;
linklist q=l;
linklist p=l;
for(int i=0;i<n;i++)
{
p=p->next;
}
while(p!=NULL)
{
q=q->next;
p=p->next;
}
printf("%d",q->data);
return;
}
//排序
linklist sort(linklist l)
{
if(NULL==l||NULL==l->next)
return l;
for(linklist i=l;i->next!=NULL;i=i->next)
{
linklist max;
max=i;
for(linklist j=i->next;j!=NULL;j=j->next)
{
if(i->data<j->data)
{
max=j;
}
}
if(max!=i)
{
int t=i->data;
i->data=max->data;
max->data=t;
}
}
return l;
}
//释放
linklist free_space(linklist l)
{
if(NULL==l)
return l;
while(l!=NULL)
{
l=delete_head(l);
}
return l;
}
//链表长度
int lend(linklist l)
{
int len=0;
linklist s=l;
while(s!=NULL)
{
s=s->next;
len++;
}
return len;
}
//遍历
void output(linklist l)
{
if(l==NULL)
return;
printf("链表:\n");
while(l!=NULL)
{
printf("%d ",l->data);
l=l->next;
}
return;
}
运行结果:
思维导图: