函数功能:
0.排序(逆置和顺序排序) 1.回显 2.头插 3.位插 4.尾插 5.尾删 6.头删
7.位删 8.查找 (按值或按位查找) 9.修改 (按值或按位修改) 10.退出
main.c
#include "link.h"
int main()
{
link_p H = link_create();
if(NULL == H)
printf("申请失败");
else
{
int i;
do
{
printf("0.排序\t1.回显\t2.头插\t3.位插\t4.尾插\t5.尾删\n");
printf("6.头删\t7.位删\t8.查找\t9.修改\t10.退出\n");
printf("请输入指令选项:");
scanf("%d", &i);
switch(i)
{
case 0: link_short(H);break;
case 2: head_add(H);break;
case 1: link_show(H);break;
case 3: idex_inset(H);break;
case 4: tail_add(H);break;
case 5: tail_delete(H);break;
case 6: head_delete(H);break;
case 7: idex_delete(H);break;
case 8: idex_find(H);break;
case 9: idex_change(H);break;
case 10: link_delete(H);
printf("已退出\n");break;
}
}while(10!= i);
}
}
link.c
#include "link.h"
//create link head
link_p link_create()
{
link_p H = (link_p)malloc(sizeof(link));
if(NULL == H)
{
printf("失败");
return NULL;
}
H -> len = 0;
printf("申请成功\n");
return H;
}
//创建数据结点
link_p link_node()
{
link_p p = (link_p)malloc(sizeof(link));
if(NULL == p)
{
printf("失败");
return NULL;
}
printf("请输入数据结点存储的值:");
scanf("%d", &p -> data);
p -> next = NULL;
return p;
}
//头插
void head_add(link_p H)
{
link_p in = link_node();
in -> next = H -> next;
H -> next = in;
H -> len++;
}
//尾插
void tail_add(link_p H)
{
//创建结点
link_p p = link_node();
//将结点链接到尾部
link_p q = H;
for(int i = 0; i < H -> len; i++)
q = q -> next;
q -> next = p;
H -> len++;
}
//位插
void idex_inset(link_p H)
{
//输入位置,判断是否能进行插入操作
printf("位置:");
int num;
scanf("%d", &num);
if(num < 1 || num > H -> len + 1)
{
printf("插入失败");
return;
}
//找到插入位置的前一个结点
link_p q = H;
for(int i = 0; i < num - 1; i++)
q = q -> next;
//创建结点链接到尾部
link_p p = link_node();
p -> next = q -> next;
q -> next = p;
H -> len++;
}
//头删
void head_delete(link_p H)
{
if(empty(H))
{
printf("空");
return;
}
link_p p = H -> next;
H -> next = p -> next;
H -> len--;
free(p);
p = NULL;
}
//尾删
void tail_delete(link_p H)
{
if(empty(H))
{
printf("空");
return;
}
link_p q = H;
for(int i = 0; i < H -> len - 1; i++)
q = q -> next;//找到倒数第二个数据的地址
link_p p = q -> next;
q -> next = p -> next;
H -> len--;
free(p);
p = NULL;
}
//位删
void idex_delete(link_p H)
{
printf("位置:");
int num;
scanf("%d", &num);
if(empty(H) || num > H -> len || num < 1)
{
printf("空");
return;
}
link_p q = H;
for(int i = 0; i < num - 1; i++)
q = q -> next;
link_p p = q -> next;
q -> next = p -> next;
H -> len--;
free(p);
p = NULL;
}
//查找
link_p idex_find(link_p H)
{
if(empty(H))
{
printf("空");
return NULL;
}
printf("1.按位查找\t2.按值查找\n请输入你的选项:");
int n;
scanf("%d", &n);
switch(n)
{
case 1:
printf("位置:");
scanf("%d", &n);
if(n > H -> len || n < 1)
{
printf("空");
return NULL;
}
link_p q = H;
for(int i = 0; i < n; i++)
q = q -> next;
return q;
case 2:
printf("请输入查找的值");
datatype data;
scanf("%d", &data);
link_p p = H -> next;
do
{
if(p -> data == data)
{
printf("%p\n", p);
return p;
}
p = p -> next;
}while(p != NULL);
printf("没有你要查找的值\n");
}
}
//修改
void idex_change(link_p H)
{
if(empty(H))
{
printf("空");
return;
}
printf("1.按位修改\t2.按值修改\n请输入修改选项:");
int i;
scanf("%d", &i);
switch(i)
{
case 1:
printf("位置:");
int num;
scanf("%d", &num);
if(empty(H) || num > H -> len || num < 1)
{
printf("空");
return;
}
link_p q = H;
for(int i = 0; i < num; i++)
q = q -> next;
printf("请输入修改后的值:");
scanf("%d", &q -> data);
link_show(H);
break;
case 2:
if(empty(H))
{
printf("空");
return;
}
printf("请输入需要修改的值");
datatype data;
scanf("%d", &data);
link_p p = H -> next;
for(int i = 0; i < H -> len; i++)
{
if(p -> data == data)
{
printf("请输入修改后的值:");
scanf("%d", &p -> data);
return;
}
p = p -> next;
}
printf("没有你要修改的值");
}
}
//排序
void link_short(link_p H)
{
if(empty(H))
{
printf("空");
return;
}
printf("1.顺序排序\t2.逆置\n请输入你的选项:");
int n, m, i;
scanf("%d", &n);
link_p q = H -> next;
m = H -> len;
datatype arr[m];
switch(n)
{
case 1:
for(int i = 0; i < H -> len - 1; i++)
{
link_p p = q -> next;
for(int j = i + 1; j < H -> len; j++)
{
if(q -> data > p -> data)
p -> data = q -> data + p -> data - (q -> data = p -> data);
p = p -> next;
}
q = q -> next;
}
break;
case 2:
i = 0;
n = H -> len;
q = H -> next;
do
{
arr[i] = q -> data;
i++;
q = q -> next;
}while(q != NULL);
q = H -> next;
do
{
m--;
q -> data = arr[m];
q = q ->next;
}while(q != NULL);
}
link_show(H);
}
//销毁链表
void link_delete(link_p H)
{
while(H -> next != NULL)
tail_delete(H);
}
//回显数据
void link_show(link_p H)
{
if(empty(H))
{
printf("空");
return ;
}
link_p p = H -> next;
printf("————");
for(int i = 0; i < H -> len; i++)
{
printf("%d",p -> data);
p = p -> next;
}
printf("————");
putchar(10);
}
//判空
int empty(link_p H)
{
return H == NULL;
}
link.h
#ifndef __LINK_H__
#define __LINK_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int datatype;
typedef struct link
{
union
{
datatype data;
int len;
};
struct link *next;
}link, *link_p;
//创建头结点和数据节点
link_p link_create();
link_p link_node();
//节点功能函数
void head_add(link_p H);
void tail_add(link_p H);
void idex_inset(link_p H);
void head_delete(link_p H);
void tail_delete(link_p H);
void idex_delete(link_p H);
link_p idex_find(link_p H);
void idex_change(link_p H);
void link_delete(link_p H);
void link_short(link_p H);
void link_show(link_p H);
int empty(link_p H);
#endif