头定义:
typedef int datatype;
typedef struct Node
{
//数据域存储数据
datatype data;
//指针域存储下一个地址
struct Node *next;
}*Linkelist;
创建节点
Linkelist create_node()//创建新节点
{
Linkelist node=(Linkelist)malloc(sizeof(struct Node));
if(node==NULL)
return NULL;
node->data=0;
node->next=NULL;
return node;
}
头插(从第一个插入)
Linkelist insert_head(datatype e,Linkelist L)//头插
{
//在堆区创建一个节点
Linkelist node=create_node();//在堆区申请一个节点
node->data=e;//赋值
node->next=L;//头插
L=node;
return L;
}
输出
int output(Linkelist L)//输出
{
if(L==NULL)
{
return -1;
}
while(L!=NULL)
{
printf("%d ",L->data);
L=L->next;
}
puts("");
return 0;
}
尾插(插在最后一个)
Linkelist insert_rear(datatype e,Linkelist L)//尾插
{
//创建一个新节点
Linkelist newrear=create_node();
newrear->data=e;
if(L==NULL)
L=newrear;
else
{
Linkelist rear=L;//尾节点从头节点开始后移
while(rear->next!=NULL)
{
rear=rear->next;
}
rear->next=newrear;
}
return L;
}
头删(删除第一个)
Linkelist delete_head(Linkelist L)//头删
{
//判断链表是否为空
if(L==NULL)
return NULL;
if(L->next==NULL)
{
free(L);
L=NULL;
}
else
{
Linkelist q=L->next;
L->data=q->data;
L->next=q->next;
free(q);
q=NULL;
}
return L;
}
尾删
Linkelist delete_rear(Linkelist L)//尾删
{
if(L==NULL)
return NULL;
if(L->next==NULL)
{
free(L);
L=NULL;
}
else
{
Linkelist secondrear=L;
while(secondrear->next->next!=NULL)
{
secondrear=secondrear->next;
}
free(secondrear->next);
secondrear->next=NULL;
}
return L;
}
计算节点数
int len_Linkelist(Linkelist L)//计算节点数
{
int count=0;
while(L!=NULL)
{
count++;
L=L->next;
}
return count;
}
按位置插入
Linkelist insert_pos(int pos,datatype e,Linkelist L)//按位置插入
{
if(NULL==L||pos<1||pos>len_Linkelist(L)+1)
{
printf("插入失败\n");
return L;
}
Linkelist p=L;
if(pos==len_Linkelist(L)+1)
{
insert_rear(e,L);
return L;
}
for(int i=1;i<pos;i++)
{
p=p->next;
}
Linkelist new=create_node();
new->next=p->next;
p->next=new;
new->data=p->data;
p->data=e;
return L;
}
按位置修改
Linkelist rev_pos(int pos,datatype e,Linkelist L)//按位置修改
{
if(NULL==L||pos<1||pos>len_Linkelist(L))
{
printf("修改失败\n");
return L;
}
Linkelist p=L;
for(int i=1;i<pos;i++)
{
p=p->next;
}
p->data=e;
return L;
}
按位置查找
datatype seek_pos(int pos,Linkelist L)//按位置查找
{
if(NULL==L||pos<1||pos>len_Linkelist(L))
{
return -1;
}
Linkelist p=L;
for(int i=1;i<pos;i++)
{
p=p->next;
}
return p->data;
}
按位置删除
Linkelist delete_pos(int pos,Linkelist L)//按位置删除
{
if(NULL==L||pos<1||pos>len_Linkelist(L))
{
printf("删除失败\n");
return L;
}
Linkelist p=L;
if(pos==1)
{
L=delete_head(L);
}
else
{
for(int i=1;i<pos-1;i++)
{
p=p->next;
}
Linkelist q=p->next;
p->next=q->next;
free(q);
q=NULL;
}
return L;
}
查找元素位置
int search_pos(datatype key, Linkelist L)//查找元素位置
{
if(NULL==L)
return -1;
int pos=0;
while(L!=NULL)
{
pos++;
if(L->data==key)
return pos;
L=L->next;
}
return -1;
}
按元素删除
Linkelist delete_data(datatype key,Linkelist L)//按元素删除
{
int pos=search_pos(key,L);
if(pos==-1)
{
printf("删除失败\n");
return L;
}
L=delete_pos(pos,L);
return L;
}
全部逆置
Linkelist rev_linklist(Linkelist L)//全部逆置
{
if(NULL==L||L->next==NULL)
return L;
Linkelist p=L->next;
int len=len_Linkelist(L);
L->next=NULL;
for(int i=1;i<len;i++)
{
Linkelist t=p;
p=p->next;
t->next=L;
L=t;
}
return L;
}
释放所有节点空间
Linkelist free_space(Linkelist L)//释放空间
{
if(NULL==L)
{
return NULL;
}
int len=len_Linkelist(L);
for(int i=0;i<len;i++)
{
L=delete_head(L);
}
return L;
}
对节点输入值并进行冒泡排序(升序)
void Bubble(Linkelist L)//冒泡
{
if(NULL==L||L->next==NULL)
return;
int len=len_Linkelist(L);
int i,j,count;
Linkelist p;
for(i=1;i<len;i++)
{
count==0;
for(j=0,p=L;j<len-i;j++,p=p->next)
{
if(p->data>p->next->data)
{
datatype t=p->data;
p->data=p->next->data;
p->next->data=t;
count++;
}
}
if(count==0)
break;
}
}
对节点输入值并进行简单排序(升序)
void Sort(Linkelist L)//简单排序
{
if(NULL==L||L->next==NULL)
return;
Linkelist p,q,k;
int len=len_Linkelist(L);
int i,j;
for(i=1,p=L;i<len;i++,p=p->next)
{
k=p;
for(j=i+1,q=p->next;j<len+1;j++,q=q->next)
{
if(k->data>q->data)
k=q;
}
if(k->data!=p->data)
{
datatype m=p->data;
p->data=k->data;
k->data=m;
}
}
}
按元素插入
Linkelist insert_data(datatype key,datatype e,Linkelist L)//按元素插入
{
if(NULL==L)
return L;
int pos=search_pos(key,L);
if(pos==-1)
{
printf("插入失败\n");
return L;
}
insert_pos(pos,e,L);
return L;
}
按元素修改
Linkelist rev_data(datatype key,datatype e,Linkelist L)//按元素修改
{
if(NULL==L)
return L;
int pos=search_pos(key,L);
if(pos==-1)
{
printf("修改失败\n");
return L;
}
rev_pos(pos,e,L);
return L;
}