一、单向链表完整操作
代码编写采用多文件编译方式:
主函数:main.c;头文件:head.h;封装函数:test.c;
head.h
#ifndef __HEAD_H
#define __HEAD_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//创建一个单链表
typedef int datatype;
typedef struct Node
{
//数据元素
int data;
//指针域:存储下一个节点地址
struct Node *next;
}*Linklist;
//申请空间
Linklist Creat_node();
//单链表头插
Linklist Insert_head(datatype e,Linklist L);
//循环遍历输出
int Output(Linklist L);
//单链表尾插
Linklist Insert_rear(datatype e,Linklist L);
//头删除
Linklist Delete_head(Linklist L);
//尾删除
Linklist Delete_rear(Linklist L);
//按任意位置插入
Linklist Insert_pos(int pos,datatype e,Linklist L);
//按任意位置查找
int Serach_pos(int pos,Linklist L);
//按任意位置修改
int Update_pos(int pos,datatype e,Linklist L);
//按任意位置删除
Linklist Delete_pos(int pos,Linklist L);
//按任意元素查找
int Serach_data(datatype data,Linklist L);
//按任意元素插入
Linklist Insert_data(datatype e,datatype data,Linklist L);
//按任意元素修改
int Update_data(datatype e,datatype data,Linklist L);
//按任意元素删除
Linklist Delete_data(datatype data,Linklist L);
//逆置
Linklist rev_Linklist(Linklist L);
//链表释放
Linklist free_space(Linklist L);
//冒泡排序
void Bubble(Linklist L);
//简单选择排序
void Simple(Linklist L);
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
//单链表的头插
Linklist L=NULL;
int n;
datatype e;
printf("请输入n的值:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入第%d个链表数据:",i+1);
scanf("%d",&e);
L=Insert_head(e,L);
}
//尾插
for(int i=0;i<n;i++)
{
printf("请输入第%d个链表数据:",i+1);
scanf("%d",&e);
L=Insert_rear(e,L);
}
//循环链表
Output(L);
//头删除
Delete_head(L);
Output(L);
//尾部删除
L=Delete_rear(L);
Output(L);
//按任意位置插入
int pos;
printf("请输入要插入的位置:");
scanf("%d",&pos);
printf("请输入要插入的数据:");
scanf("%d",&e);
L=Insert_pos(pos,e,L);
Output(L);
//按任意位置查找
printf("请输入要查找的位置:");
scanf("%d",&pos);
Serach_pos(pos,L);
//按任意位置修改
printf("请输入要修改的位置:");
scanf("%d",&pos);
printf("请输入修改后的数据:");
scanf("%d",&e);
Update_pos(pos,e,L);
Output(L);
//按任意位置删除
printf("请输入要删除的位置:");
scanf("%d",&pos);
L=Delete_pos(pos,L);
Output(L);
//按元素查找
datatype data;
printf("请输入要查找的元素:");
scanf("%d",&data);
int data_pos=Serach_data(data,L);
if(data_pos==-1)
printf("查找失败\n");
else
printf("该元素在%d位置\n",data_pos);
//任意元素插入
printf("请输入要插入的元素:");
scanf("%d",&data);
printf("请输入插入元素的值:");
scanf("%d",&e);
L=Insert_data(e,data,L);
Output(L);
//任意元素修改
printf("请输入要修改的元素:");
scanf("%d",&data);
printf("请输入修改后的元素:");
scanf("%d",&e);
Update_data(e,data,L);
Output(L);
//任意元素删除
printf("请输入要删除的元素:");
scanf("%d",&data);
L=Delete_data(data,L);
Output(L);
//冒泡排序
Bubble(L);
//简单选择排序
Simple(L);
Output(L);
//链表逆置
L=rev_Linklist(L);
Output(L);
//链表释放
L=free_space(L);
return 0;
}
test.c
#include "head.h"
/*
* function: 申请空间,创建节点
* @param [ in]
* @param [out]
* @return
*/
Linklist Creat_node()
{
Linklist node=(Linklist)malloc(sizeof(struct Node));
if(NULL==node)
return NULL;
node->data=0;
node->next=NULL;
return node;
}
/*
* function: 头插
* @param [ in]
* @param [out]
* @return
*/
Linklist Insert_head(datatype e,Linklist L)
{
Linklist node=Creat_node();
node->data=e;
node->next=L;
L=node;
return L;
}
/*
* function: 循环遍历输出
* @param [ in]
* @param [out]
* @return
*/
int Output(Linklist L)
{
if(NULL==L)
{
printf("打印失败\n");
return -1;
}
while(L!=NULL)
{
printf("%d\t",L->data);
L=L->next;
}
puts("");
return 0;
}
/*
* function: 单链表尾插
* @param [ in]
* @param [out]
* @return
*/
Linklist Insert_rear(datatype e,Linklist L)
{
//创建一个新节点
Linklist s=Creat_node();
s->data=e;
if(NULL==L)
{
L=s;
}
else
{
//指向最后一个节点的地址
Linklist rear=L;
while(rear->next!=NULL)
{
rear=rear->next;
}
rear->next=s;
}
return L;
}
/*
* function: 头删除
* @param [ in]
* @param [out]
* @return
*/
Linklist Delete_head(Linklist L)
{
if(NULL==L)
{
return L;
}
if(L->next==NULL)
{
free(L);
L=NULL;
}
else
{
Linklist q=L->next;
L->data=q->data;
L->next=q->next;
free(q);
q=NULL;
}
return L;
}
/*
* function: 尾部删除
* @param [ in]
* @param [out]
* @return
*/
Linklist Delete_rear(Linklist L)
{
//判断是否存在链表
if(L==NULL)
{
return NULL;
}
//判断链表中只有一个节点
else if(L->next==NULL)
{
free(L);
L=NULL;
}
else
{
//有多个节点
//循环倒数第二个节点
Linklist second=L;
while(second->next->next!=NULL)
{
second=second->next;
}
free(second->next);
second->next=NULL;
}
return L;
}
/*
* function: 计算长度
* @param [ in]
* @param [out]
* @return
*/
int Len_linklist(Linklist L)
{
int count=0;
while(L!=NULL)
{
L=L->next;
count++;
}
return count;
}
/*
* function: 单链表任意位置插入
* @param [ in]
* @param [out]
* @return
*/
Linklist Insert_pos(int pos,datatype e,Linklist L)
{
int len=Len_linklist(L);
if(NULL==L||pos<1||pos>len+1)
{
printf("插入失败\n");
return L;
}
Linklist p=L;
if(pos==len+1)
{
Insert_rear(e,L);
return L;
}
for(int i=1;i<pos;i++)
{
p=p->next;
}
Linklist s=Creat_node();
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
return L;
}
/*
* function: 按任意位置查找
* @param [ in]
* @param [out]
* @return
*/
int Serach_pos(int pos,Linklist L)
{
int len=Len_linklist(L);
if(NULL==L||pos<1||pos>len)
{
printf("查找失败\n");
return -1;
}
Linklist p=L;
for(int i=1;i<pos;i++)
{
p=p->next;
}
printf("查找的值为:%d\n",p->data);
}
/*
* function: 按任意位置修改
* @param [ in]
* @param [out]
* @return
*/
int Update_pos(int pos,datatype e,Linklist L)
{
int len=Len_linklist(L);
if(NULL==L || pos<1 || pos>len)
{
printf("修改失败\n");
return -1;
}
Linklist p=L;
for(int i=1;i<pos;i++)
{
p=p->next;
}
p->data=e;
return 0;
}
/*
* function: 按任意位置删除
* @param [ in]
* @param [out]
* @return
*/
Linklist Delete_pos(int pos,Linklist L)
{
if(NULL==L||pos<1||pos>Len_linklist(L))
{
printf("删除失败\n");
return L;
}
if(pos==1)
{
L=Delete_head(L);
return L;
}
//找到pos的前一个位置
Linklist p=L;
for(int i=1;i<pos-1;i++)
{
p=p->next;
}
Linklist q=p->next;
p->next=q->next;
free(q);
q=NULL;
return L;
}
/*
* function: 按元素查找
* @param [ in]
* @param [out]
* @return
*/
int Serach_data(datatype data,Linklist L)
{
if(NULL==L)
{
return -1;
}
int pos=0;
while(L!=NULL)
{
pos++;
if(L->data==data)
{
return pos;
}
L=L->next;
}
return -1;
}
/*
* function: 按任意元素插入
* @param [ in]
* @param [out]
* @return
*/
Linklist Insert_data(datatype e,datatype data,Linklist L)
{
if(NULL==L)
{
printf("插入失败\n");
return L;
}
int pos=Serach_data(data,L);
if(pos==-1)
printf("插入失败\n");
else
L=Insert_pos(pos,e,L);
return L;
}
/*
* function: 任意元素修改
* @param [ in]
* @param [out]
* @return
*/
int Update_data(datatype e,datatype data,Linklist L)
{
if(NULL==L)
{
printf("修改失败\n");
return -1;
}
int pos=Serach_data(data,L);
if(pos==-1)
printf("修改失败\n");
else
Update_pos(pos,e,L);
return 0;
}
/*
* function: 任意元素删除
* @param [ in]
* @param [out]
* @return
*/
Linklist Delete_data(datatype data,Linklist L)
{
if(NULL==L)
{
printf("删除失败\n");
return L;
}
int pos=Serach_data(data,L);
if(pos==-1)
return L;
else
L=Delete_pos(pos,L);
return L;
}
/*
* function: 链表逆置
* @param [ in]
* @param [out]
* @return
*/
Linklist rev_Linklist(Linklist L)
{
if(NULL==L||L->next==NULL)
{
return L;
}
Linklist p=L->next;
int len=Len_linklist(L)-1;
L->next=NULL;
for(int i=0;i<len;i++)
{
Linklist t=p;
p=p->next;
t->next=L;
L=t;
}
return L;
}
/*
* function: 链表释放
* @param [ in]
* @param [out]
* @return
*/
Linklist free_space(Linklist L)
{
if(NULL==L)
{
return L;
}
int len=Len_linklist(L);
for(int i=0;i<len;i++)
{
L=Delete_head(L);
}
return L;
}
/*
* function: 冒泡排序
* @param [ in]
* @param [out]
* @return
*/
void Bubble(Linklist L)
{
if(NULL==L||L->next==NULL)
{
printf("排序失败\n");
return;
}
int len=Len_linklist(L);
int i,j;
Linklist p=L;
for(i=1;i<len;i++)
{
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;
}
}
}
}
//简单选择排序
void Simple(Linklist L)
{
if(NULL==L||L->next==NULL)
{
printf("无法排序\n");
return ;
}
int len=Len_linklist(L);
Linklist p,q;
int i,j;
for(i=0,p=L;i<len-1;i++,p=p->next)
{
Linklist min=p;
for(j=i+1,q=p->next;j<len;j++,q=q->next)
{
if(min->data<q->data)
{
min=q;
}
}
if(min!=p)
{
int t=min->data;min->data=p->data;
p->data=t;
}
}
}