head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINKLIST_HEAD 1
#define LINKLIST_NODE 0
typedef int datatype;
typedef struct Node
{
union
{
int len;
datatype data;
};
struct Node *next;
}*Linklist;
Linklist create_node(int flag);
int insert_head(Linklist L, datatype e);
void output(Linklist L);
Linklist insert_rear(Linklist L, datatype e, Linklist rear);
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 update_pos(Linklist L, int pos, datatype e);
int search_pos(Linklist L, int pos);
int search_data(Linklist L, datatype key);
int insert_data(Linklist L, datatype key, datatype e);
int update_data(Linklist L, datatype key, datatype e);
int delete_data(Linklist L, datatype key);
void rev_linklist(Linklist L);
#endif
main.c
#include "head.h"
int main(int argc, char *argv[])
{
//1表示头结点 0表示普通结点
Linklist L = create_node(LINKLIST_HEAD);
Linklist rear = L;
int n;
printf("请输入要插入的个数:");
scanf("%d",&n);
datatype e;
for (int i = 0; i < n; i++)
{
//printf("请输入插入的值:");
//scanf("%d", &e);
//insert_head(L, e);
//头插
//insert_head(L, i + 1);
//空链表尾插
rear = insert_rear(L, i + 1, rear);
}
output(L);
/*
//头删
delete_head(L);
delete_head(L);
output(L);
*/
/*
//尾删
delete_rear(L);
delete_rear(L);
output(L);
*/
/*
//按位置插入
int pos;
printf("请输入插入的位置:");
scanf("%d",&pos);
printf("请输入要插入的值:");
scanf("%d",&e);
insert_pos(L, pos, e);
output(L);
*/
/*
//按位置删除
int pos;
printf("请输入要删除的位置:");
scanf("%d",&pos);
delete_pos(L, pos);
output(L);
*/
/*
//按位置修改
int pos;
printf("请输入要修改的位置:");
scanf("%d",&pos);
printf("请输入要修改的值:");
scanf("%d",&e);
update_pos(L, pos, e);
output(L);
*/
/*
//按位置查询
int pos;
printf("请输入要查询的位置:");
scanf("%d",&pos);
printf("查询位置的值为%d\n", search_pos(L, pos));
*/
/*
//按元素查询
datatype key;
printf("请输入要查询的值");
scanf("%d", &key);
int pos = search_data(L, key);
printf("查询的元素的位置在%d\n", pos);
*/
/*
//按元素插入
datatype key;
printf("请输入要插入位置的值:");
scanf("%d",&key);
printf("请输入要插入的值:");
scanf("%d",&e);
insert_data(L, key, e);
output(L);
*/
/*
//按元素修改
int key;
printf("请输入要修改的元素值:");
scanf("%d",&key);
printf("请输入要修改的值:");
scanf("%d",&e);
update_data(L, key, e);
output(L);
*/
/*
//按元素删除
int key;
printf("请输入要删除的元素的值:");
scanf("%d",&key);
delete_data(L, key);
output(L);
*/
//单链表逆置
rev_linklist(L);
output(L);
return 0;
}
test.c
#include "head.h"
/*
* function: 创建头结点
* @param [ in] flag
* @param [out]
* @return 成功返回首地址 失败返回NULL
*/
Linklist create_node(int flag)
{
Linklist L = (Linklist)malloc(sizeof(struct Node));
if (L == NULL)
{
return NULL;
}
//0表示普通结点 1是头结点
if (flag == LINKLIST_HEAD)
{
L->len = 0;
}
else if (flag == LINKLIST_NODE)
{
L->data = 0;
}
L->next = NULL;
return L;
}
/*
* function: 头插
* @param [ in] 链表 插入的值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_head(Linklist L, datatype e)
{
if (L == NULL)
{
printf("插入失败\n");
return -1;
}
Linklist s = create_node(LINKLIST_NODE);
if (s == NULL)
{
printf("插入失败\n");
return -1;
}
s->data = e;
s->next = L->next;
L->next = s;
L->len++;
return 0;
}
/*
* function: 遍历打印
* @param [ in] 链表
* @param [out]
* @return 无
*/
void output(Linklist L)
{
if (L == NULL || L->next == NULL)
{
printf("打印失败\n");
return;
}
Linklist p = L;
while (p->next != NULL)
{
p = p->next;
printf("%d ", p->data);
}
puts("");
}
/*
* function: 空链表尾插
* @param [ in] 链表 插入的值 尾结点
* @param [out]
* @return 尾结点
*/
Linklist insert_rear(Linklist L, datatype e, Linklist rear)
{
if (L == NULL)
{
printf("插入失败\n");
return NULL;
}
Linklist s = create_node(LINKLIST_NODE);
if (s == NULL)
{
printf("插入失败\n");
return NULL;
}
s->data = e;
rear->next = s;
rear = s;
L->len++;
return rear;
}
/*
* function: 头删
* @param [ in]
* @param [out]
* @return
*/
int delete_head(Linklist L)
{
if (L == NULL || L->next == NULL)
{
printf("删除失败\n");
return -1;
}
Linklist q = L->next;
L->next = q->next;
free(q);
L->len--;
return 0;
}
/*
* function: 尾删
* @param [ in] 链表
* @param [out]
* @return 成功返回0 失败返回-1
*/
int delete_rear(Linklist L)
{
if (L == NULL || L->next == NULL)
{
printf("删除失败\n");
return -1;
}
Linklist p = L;
while (p->next->next != NULL)
{
p = p->next;
}
free(p->next);
p->next = NULL;
L->len--;
return 0;
}
/*
* function: 按位置插入
* @param [ in] 链表 位置 值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_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 - 1; i++)
{
p = p->next;
}
Linklist s = create_node(LINKLIST_NODE);
if (s == NULL)
{
printf("插入失败");
return -1;
}
s->data = e;
s->next = p->next;
p->next = s;
L->len++;
return 0;
}
/*
* function: 按位置删除
* @param [ in] 链表 位置
* @param [out]
* @return 成功返回0 失败返回-1
*/
int delete_pos(Linklist L, int pos)
{
if (L == NULL || L->next == NULL || pos < 1 || pos > L->len)
{
printf("删除失败\n");
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--;
return 0;
}
/*
* function: 按位置修改
* @param [ in] 链表 位置 值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int update_pos(Linklist L, int pos, datatype e)
{
if (L == NULL || L->next == NULL || pos < 1 || pos > L->len)
{
printf("修改失败\n");
return -1;
}
Linklist p = L;
for (int i = 0; i < pos; i++)
{
p = p->next;
}
p->data = e;
return 0;
}
/*
* function: 按位置查询
* @param [ in] 链表 位置
* @param [out]
* @return 成功返回0 失败返回-1
*/
int search_pos(Linklist L, int pos)
{
if (L == NULL || L->next == NULL || pos < 1 || pos > L->len)
{
printf("查询失败\n");
return -1;
}
Linklist p = L;
for (int i = 0; i < pos; i++)
{
p = p->next;
}
return p->data;
}
/*
* function: 按元素查询
* @param [ in] 链表 元素值
* @param [out]
* @return 元素的位置
*/
int search_data(Linklist L, datatype key)
{
if (L == NULL || L->next == NULL)
{
printf("查询失败\n");
return -1;
}
Linklist p = L;
int pos = 0;
while (p->next != NULL)
{
p = p->next;
pos++;
if (p->data == key)
{
return pos;
}
}
printf("未找到\n");
return -1;
}
/*
* function: 按元素插入
* @param [ in] 链表 元素值 增加的值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_data(Linklist L, datatype key, datatype e)
{
if (L == NULL || L->next == NULL)
{
printf("插入失败\n");
return -1;
}
int pos = search_data(L, key);
if (pos == -1)
{
printf("插入失败\n");
}
insert_pos(L, pos, e);
return 0;
}
/*
* function: 按元素修改
* @param [ in] 链表 元素 修改值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int update_data(Linklist L, datatype key, datatype e)
{
if (L == NULL || L->next == NULL)
{
printf("修改失败\n");
return -1;
}
int pos = search_data(L, key);
if (pos == -1)
{
printf("修改失败\n");
}
update_pos(L, pos, e);
return 0;
}
/*
* function: 按元素删除
* @param [ in] 链表 元素值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int delete_data(Linklist L, datatype key)
{
if (L == NULL || L->next == NULL)
{
printf("修改失败\n");
return -1;
}
int pos = search_data(L, key);
if (pos == -1)
{
printf("删除失败\n");
return -1;
}
delete_pos(L, pos);
return 0;
}
/*
* function: 单链表逆置
* @param [ in] 单链表
* @param [out]
* @return 无
*/
void rev_linklist(Linklist L)
{
if (L == NULL || L->next == NULL)
{
printf("修改失败\n");
return;
}
Linklist p = L->next;
L->next = NULL;
while (p != NULL)
{
Linklist s = p;
p = p->next;
s->next = L->next;
L->next = s;
}
}