head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Node
{
union
{
int len;
datatype data;
};
struct Node *next;
}*linklist;
void menue();//菜单
linklist create();//创建节点
void output(linklist L);//输出
int insert_head(linklist L,datatype e);//头插
int insert_rear(linklist L,datatype e);//尾插
int delete_head(linklist L);//头删
int delete_rear(linklist L);//尾删
int insert_pos(linklist L,int pos,datatype e);//按位插入
int delete_pos(linklist L,int pos);//按位删除
int remake_pos(linklist L,int pos,datatype e);//按位修改
int find_pos(linklist L,int pos);//按位置查询
int find_data(linklist L,datatype key);//按元素查找位置
int insert_data(linklist L,datatype key,datatype e);//按照元素插入值
int delete_data(linklist L,datatype key);//按元素删除
int remake_data(linklist L,datatype key,datatype e);//按元素修改
void linklist_rev(linklist L);//单项列表逆置
linklist free_space(linklist L);//释放空间
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
//创建头节点L
linklist L = create(1);
menue();
int number;
while(1)
{
printf("\n请输入您的选择:");
scanf("%d",&number);
switch(number)
{
case 1:
{
int n;
datatype e;
printf("请输入元素个数");
scanf("%d",&n);
for (int i=0;i<n;i++)
{
printf("请输入第%d个插入的元素:",i+1);
scanf("%d",&e);
insert_head(L,e);
}
}break;
case 2:
{
output(L);
}break;
case 3:
{
int n;
datatype e;
printf("请输入元素个数");
scanf("%d",&n);
for (int i=0;i<n;i++)
{
printf("请输入第%d个插入的元素:",i+1);
scanf("%d",&e);
insert_rear(L,e);
}
}break;
case 4:
{
delete_head(L);
}break;
case 5:
{
delete_rear(L);
}break;
case 6:
{
int pos;
datatype e;
printf("请输入插入的位置与值");
scanf("%d %d",&pos,&e);
insert_pos(L,pos,e);
}break;
case 7:
{
int pos;
printf("请输入要删除元素的位置");
scanf("%d",&pos);
delete_pos(L,pos);
}break;
case 8:
{
int pos;
datatype e;
printf("请输入修改的位置与值");
scanf("%d %d",&pos,&e);
remake_pos(L,pos,e);
}break;
case 9:
{
int pos;
printf("请输入要查找的位置");
scanf("%d",&pos);
find_pos(L,pos);
}break;
case 10:
{
datatype key;
printf("请输入要查找的元素");
scanf("%d",&key);
find_data(L,key);
}break;
case 11:
{
datatype key;
datatype e;
printf("请输入元素以及插入这个元素的值");
scanf("%d %d",&key,&e);
insert_data(L,key,e);
}break;
case 12:
{
datatype key;
printf("请输入要删除的元素:");
scanf("%d",&key);
delete_data(L,key);
}break;
case 13:
{
datatype key;
datatype e;
printf("请输入元素以及修改这个元素的值");
scanf("%d %d",&key,&e);
remake_data(L,key,e);
}
case 14://排序
{
}break;
case 15://逆置
{
linklist_rev(L);
}break;
case 16://释放
{
free_space(L);
}
default:printf("输入错误,请重新输入\n");break;
case 0:printf("退出程序\n");exit(0);
}
}
}
test.c
#include "head.h"
void menue()
{
puts("****************");
puts("\t1,单项链表头插");
puts("\t2,单项链表遍历");
puts("\t3,单项链表尾插");
puts("\t4,单向链表头删");
puts("\t5,单向链表尾删");
puts("\t6,单向链表按下表插入");
puts("\t7,单向链表按下表删除");
puts("\t8,单向链表按下表修改");
puts("\t9,单向链表按下表查找");
puts("\t10,按照元素查找位置");
puts("\t11,按照元素插入值");
puts("\t12,按照元素删除");
puts("\t13,按照元素修改");
puts("\t14,单向链表排序");
puts("\t15,单向链表逆置");
puts("\t16,单向链表释放空间");
puts("****************");
}
/*
* function: 创建节点
* @param [ in] 头结点1 新节点0
* @param [out]
* @return
*/
linklist create(int flag)
{
//创建头节点
linklist L=(linklist)malloc(sizeof(struct Node));
if(L==NULL)
{
return NULL;
}
//成功
//对头结点L的数据域初始化
if(flag == 1)
{
L->len = 0;
}
//创建新节点
else if(flag == 0)
{
L->data = 0;
}
//对头结点的指针初始化
L->next = NULL;
return L;
}
/*
* function: 头插
* @param [ in] 链表 插入的值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_head(linklist L,datatype e)
{
//1、判断链表是否创建
if(L ==NULL)
{
puts("头插失败");
return -1;
}
//2、头插
//创建一个新的节点s
linklist s = create(0);
if (s == NULL)
{
return -1;
}
//新节点创建成功
//s的数据域赋值
s->data = e;
s->next = L->next;
L->next = s;
L->len++;
return 0;
}
/*
* function: 循环输出
* @param [ in]
* @param [out]
* @return
*/
void output(linklist L)
{
//1.判断链表是否创建
//2.判断链表是否为空
if(L ==NULL || L->len ==0)
{
puts("遍历失败");
}
//3.遍历
//
linklist p=L;
while(p->next != NULL)
{
p =p->next;
printf("%d\t",p->data);
}
puts("");
}
/*
* function: 尾部插入
* @param [ in]
* @param [out] 链表 插入的值
*
* @return
*/
int insert_rear(linklist L,datatype e)
{
//判断链表是否创建
if(L == NULL)
{
return -1;
}
//尾部插入
//循环尾部节点
linklist p = L;
while(p->next != NULL)
{
p = p->next;
}
//在最后插入s
linklist s = create(0);
if(s == NULL)
{
return -1;
}
s->data = e;
p->next = s;
L->len++;
return 0;
}
/*
* function: 头部插入
* @param [ in]
* @param [out] 链表
* @return
*/
int delete_head(linklist L)
{
//判断链表是否创建
//判断链表是否为空
if(L == NULL || L->next == NULL)
{
puts("删除失败,链表未创建或链表为空");
return -1;
}
linklist q = L->next;
L->next = q->next;
free(q);
q = NULL;
L->len--;
puts("头删成功");
return 0;
}
/*
* function: 尾部删除
* @param [ in]
* @param [out] 链表
* @return
*/
int delete_rear(linklist L)
{
//判断链表是否创建
//判断链表是否为空
if(L == NULL || L->len ==0)
{
puts("删除失败,链表未创建或链表为空");
return -1;
}
linklist p = L;
while(p->next->next != NULL)
{
p = p->next;
}
free(p->next);
p->next = NULL;
L->len--;
puts("尾删成功");
return 0;
}
/*
* function: 按位置插入值
* @param [ in]
* @param [out] 链表 插入的位置 插入的值
* @return
*/
int insert_pos(linklist L,int pos,datatype e)
{
//判断链表是否创建
//判断位置是否合法
if(L == NULL || pos<1 || pos>L->len+1)
{
printf("插入失败\n");
return -1;
}
//循环到pos-1,起名为p
linklist p =L;
for (int i=0;i<pos-1;i++)
{
p = p->next;
}
linklist s= create(0);
if (s == NULL)
{
return -1;
}
s->data =e;
s->next = p->next;
p->next =s;
L->len++;
printf("插入成功\n");
return 0;
}
/*
* function: 按位删除
* @param [ in]
* @param [out] 链表 位置pos
* @return
*/
int delete_pos(linklist L,int pos)
{
//判断链表是否创建
//判断链表是否为空
//判断位置是否合法
if(L == NULL || L->next == NULL || pos<1 || pos>L->len)
{
puts("删除失败");
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--;
}
/*
* function: 按照位置修改
* @param [ in]
* @param [out] 链表 位置pos 值e
* @return
*/
int remake_pos(linklist L,int pos,datatype e)
{
//判断链表是否创建
//判断位置是否合法
if(L == NULL || pos<1 || pos>L->len+1)
{
printf("插入失败\n");
return -1;
}
linklist p =L;
for(int i=0;i<pos;i++)
{
p = p->next;
}
p->data = e;
printf("修改成功\n");
return 0;
}
/*
* function: 按位置查询
* @param [ in]
* @param [out] 链表 位置pos
* @return
*/
int find_pos(linklist L,int pos)
{
if(L == NULL || pos<1 || pos >L->len)
{
printf("查询失败\n");
return -1;
}
linklist p = L;
for (int i =0;i<pos;i++)
{
p=p->next;
}
printf("第%d个元素为%d\n",pos,p->data);
return 0;
}
/*
* function: 按元素查找
* @param [ in]
* @param [out] 链表 查找的值
* @return 成功返回位置
*/
int find_data(linklist L,datatype key)
{
//判断链表是否创建
//判断链表是否为空
if(L ==NULL || L->len == 0)
{
printf("查找失败\n");
return -1;
}
linklist p=L;
int count = 0;
while(p->next != NULL)
{
p = p->next;
count++;
if(p->data == key)
{
return count;
}
}
return 0;
}
/*
* function: 按元素插入
* @param [ in] 链表 已有元素key 插入元素e
* @param [out]
* @return
*/
int insert_data(linklist L,datatype key,datatype e)
{
int pos = find_data(L,key);
if(pos == -1)
{
puts("按元素插入失败");
return -1;
}
insert_pos(L,pos,e);
printf("按元素插入成功\n");
return 0;
}
/*
* function: 按元素删除
* @param [ in]
* @param [out] 链表 要删除的元素key
* @return
*/
int delete_data(linklist L,datatype key)
{
int pos = find_pos(L,key);
if (pos = -1)
{
puts("删除失败");
return -1;
}
delete_pos(L,pos);
puts("删除成功");
return 0;
}
/*
* function: 按元素修改
* @param [ in]
* @param [out] 链表 原元素 修改元素
* @return
*/
int remake_data(linklist L,datatype key,datatype e)
{
int pos = find_pos(L,key);
if(pos = -1)
{
puts("修改失败");
return -1;
}
remake_pos(L,pos,e);
puts("修改成功");
}
/*
* function: 逆置
* @param [ in] 链表
* @param [out]
* @return 无
*/
void linklist_rev(linklist L)
{
//1,判断链表是否创建
//2,判断链表是否为空
if(L==NULL || L->next==NULL)
{
return ;
}
//3逆置
linklist p=L->next;
L->next=NULL;
while(p!=NULL)
{
linklist t=p;
p=p->next;
//把t节点头插到L节点的后面
t->next=L->next;
L->next=t;
}
}
/*
* function: 释放空间
* @param [ in]
* @param [out] 链表
* @return
*/
linklist free_space(linklist L)
{
if(L==NULL)
{
return NULL;
}
//释放
int n=L->len;
for(int i=0;i<n;i++)
{
delete_head(L);
}
free(L);
L=NULL;
return L;
}
ubun