main.c文件
#include"head1.h"
int main(int argc, const char *argv[])
{
//创建头节点
linklist L=create(0);//0 头结点 ;1 普通节点
menu();
int member;
while(1)
{
printf("\n请输入你的选择:");
scanf("%d",&member);
switch(member)
{
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:
{
printf("%d\r\n",L->len);
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,e;
printf("请输入插入的位置和数值:");
scanf("%d %d",&pos,&e);
insert_pos(L,pos,e);
}break;
case 7:
{
int pos;
printf("请输入删除的位置\n");
scanf("%d",&pos);
delete_pos(L,pos);
}break;
case 8:
{
int pos;
datatype e;
printf("请输入修改的位置和值:");
scanf("%d %d",&pos,&e);
update_pos(L,pos,e);
}break;
case 9:
{
int pos;
printf("请输入你要查找的位置:");
scanf("%d",&pos);
find_pos(L,pos);
}break;
case 10:
{
int key;
printf("请输入您要查找的元素:");
scanf("%d",&key);
int count=find_data(L,key);
printf("数值 %d 在第 %d 个结点\n",key,count);
}break;
case 11:
{
int e;
printf("请输入要删除的值:");
scanf("%d",&e);
delete_data(L,e);
}break;
case 12:
{
datatype key,e;
printf("请输入要修改的值和结果:");
scanf("%d %d",&key,&e);
updata_data(L,key,e);
}break;
case 13:
{
datatype key,e;
printf("请输入选定的值和要插入的值:");
scanf("%d %d",&key,&e);
insert_data(L,key,e);
}break;
defaault:
{
printf("\n您的输入还没有创建");
}break;
case 15:
{
linklist_rev(L);
}break;
case 16:
L=free_space(L);break;
case 0:printf("程序结束\n");exit(0);
}
}
return 0;
}
2.test.c文件
#include"head1.h"
void menu()
{
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("\t15,单项链表逆置");
puts("\t16,单项链表空间释放");
puts("\t0,程序结束");
puts("*******************");
}
//创建头节点
linklist create(int flag)
{
linklist L=(linklist)malloc(sizeof(struct Node));
if(L==NULL)
{
return NULL;
}
//创建成功
if(flag==0)
{
L->len=0;
}
else if(flag==1)
L->data=0;
L->next=NULL;
return L;
}
//1.头部插入
int insert_head(linklist L,datatype e)
{
if(L==NULL)
{
printf("头部插入失败\n");
return -1;
}
//创建新节点s
linklist s=create(1);
if(s==NULL)
return -1;
//创建新节点s成功
s->next=L->next;
L->next=s;
s->data=e;
L->len++;
return 0;
}
//2.遍历
void output(linklist L)
{
if(L==NULL||L->len==0)
{
printf("遍历失败!");
}
linklist k=L;
while(k->next!=NULL)
{
k=k->next;
printf("%d\t",k->data);
}
}
//3.尾部插入
int insert_rear(linklist L,datatype e)
{
if(L==NULL)
{
printf("尾部插入失败!\n");
return -1;
}
//找尾部
linklist k=L;
while(k->next!=NULL)
{
k=k->next;
}
//创建尾部插入节点
linklist s=create(1);
if(s=NULL)
return -1;
s->data=e;
//链接s
k->next=s;
L->len++;
return 0;
}
void delete_head(linklist L)
{
if(L==NULL||L->len==0)
printf("不能头删\n");
//可以头删
linklist q=L->next;
L->next=q->next;
free(q);
q=NULL;
L->len--;
}
//5.尾部删除
int delete_rear(linklist L)
{
if(L==NULL)
{
printf("尾部删除失败!\n");
return -1;
}
//找尾部前一位
linklist k=L;
while(k->next->next!=NULL)
{
k=k->next;
}
//
free(k->next);
k->next=NULL;
L->len--;
return 0;
}
//6.按照位置插入
int insert_pos(linklist L,int pos,int e)
{
if(L==NULL||pos<1||pos>L->len+1)
{
printf("插入失败!\n");
return -1;
}
//找寻位置
linklist k=L;
for(int i=0;i<pos-1;i++)
{
k=k->next;
}
//创建节点
linklist s=create(1);
if(s==NULL)
return -1;
//创建成功
s->data=e;
s->next=k->next;
k->next=s;
L->len++;
printf("按照位置插入成功\n");
return 0;
}
//7.按照位置删除
int delete_pos(linklist L,int pos)
{
if(L==NULL||L->len==0||pos<1||pos>L->len)
{
printf("按照位置删除失败\n");
return -1;
}
//可以删除
//找寻位置
linklist k=L;
for(int i=0;i<pos-1;i++)
{
k=k->next;
}
linklist m=k->next;
k->next=m->next;
free(m);
m=NULL;
L->len--;
printf("按照位置删除成功\n");
return 0;
}
//8.按照位置修改
int update_pos(linklist L,int pos,datatype e)
{
if(L==NULL||L->len==0||pos<1||pos>L->len)
{
printf("按照位置修改失败\n");
return -1;
}
//找寻位置
linklist k=L;
for(int i=0;i<pos;i++)
{
k=k->next;
}
//找到位置
k->data=e;
printf("按照位置修改成功\n");
return 0;
}
//9.按照位置查找
int find_pos(linklist L,int pos)
{
if(L==NULL||L->len==0||pos<1||pos>L->len)
{
printf("按照位置查找失败\n");
return -1;
}
//找寻位置
linklist k=L;
for(int i=0;i<pos;i++)
{
k=k->next;
}
//找到位置
printf("位置%d所存的值是%d\n",pos,k->data);
return 0;
}
//10.按照元素查找
int find_data(linklist L,int key)
{
if(L==NULL||L->len==0)
{
printf("查找失败!\n");
return -1;
}
//可以查找
//循环比较
linklist k=L;
int count=0;
while(k->next!=NULL)
{
k=k->next;
count++;
if(k->data==key)
{
return count;
}
}
return -1;
}
//11.按照元素删除
void delete_data(linklist L,int e)
{
//1.找到元素位置
int count =find_data(L,e);
//2.按照位置删除
delete_pos(L,count);
printf("值 %d 删除成功",e);
}
//12.按照数值修改
void updata_data(linklist L,datatype key,datatype e)
{
//1.找到元素位置
int count =find_data(L,key);
//2.修改数值
update_pos(L,count,e);
}
//13.按照数值插入
void insert_data(linklist L,datatype key,datatype e)
{
//1.找到元素位置
int count =find_data(L,key);
//2.插入数值
insert_pos(L,count,e);
}
//逆置
void linklist_rev(linklist L)
{
if(L==NULL||L->next==NULL)
printf("逆置失败!\n");
//头结点和普通节点分开
linklist p=L->next;
L->next=NULL;
//开始逆置
while(p!=NULL)
{
linklist t=p;
p=p->next;
t->next=L->next;
L->next=t;
}
printf("逆置成功!\n");
}
//空间释放
linklist free_space(linklist L)
{
if(L==NULL)
{
printf("空间释放失败!\n");
return NULL;
}
int n=L->len;
for(int i=0;i<n;i++)
{
delete_head(L);
}
free(L);
L=NULL;
printf("空间释放成功\n");
return L;
}
3.head.h文件
#ifndef NNN
#define NNN
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int datatype;
typedef struct Node
{
//数据域
union
{
int len;//头结点数据域 链表长度
int data;//其他节点的数据域 数据元素
};
//指针域:下一个节点地址
struct Node *next;
}*linklist;
linklist create(int flag);
void menu();
int insert_head(linklist L,datatype e);
void output(linklist L);
int insert_rear(linklist L,datatype e);
void delete_head(linklist L);
int delete_rear(linklist L);
//按照位置
int insert_pos(linklist L,int pos,int e);
int delete_pos(linklist L,int pos);
int update_pos(linklist L,int pos,datatype e);
int find_pos(linklist L,int pos);
//按照数值
int find_data(linklist L,int key);
void delete_data(linklist L,int e);
void updata_data(linklist L,datatype key,datatype e);
void insert_data(linklist L,datatype key,datatype e);
//逆置 释放
void linklist_rev(linklist L);
linklist free_space(linklist L);
#endif