头文件
#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;
linklist create_head();
linklist create_node();
int insert_head(linklist list,datatype e);
int output(linklist list);
int insert_rear(linklist list,datatype e);
int delete_head(linklist list);
int delete_rear(linklist list);
int insert_pos(linklist list,int pos,datatype e);
int delete_pos(linklist list,int pos);
int search_pos(linklist list,int pos);
int amend_pos(linklist list,int pos,datatype key);
int search_data(linklist list,datatype key);
int amend_data(linklist list,datatype key,datatype e);
linklist free_node(linklist list);
#endif
自定义函数
#include"head.h"
/*
* function: 申请头结点空间
* @param [ in] 无
* @param [out]
* @return 成功返回地址,失败返回NULL
*/
linklist create_head()
{
linklist list = (linklist)malloc(sizeof(struct Node));
if(list == NULL)
return NULL;
list->next = NULL;//指针清空
list->len = 0;//长度清空
return list;
}
/*
* function: 创建节点
* @param [ in] 无
* @param [out]
* @return 成功返回地址,失败返回NULL
*/
linklist create_node()
{
linklist p = (linklist)malloc(sizeof(struct Node));
if(p == NULL)
return NULL;
p->next = NULL;//指针清空
p->data = 0;//数据清空
return p;
}
/*
* function: 头插
* @param [ in] 头结点,数据
* @param [out]
* @return 成功返回0,失败返回-1
*/
int insert_head(linklist list,datatype e)
{
if(list == NULL)
{
return -1;
}
linklist p = create_node();
{
if(p == NULL)
{
printf("头插失败\n");
return -1;
}
}
p->data = e;
p->next = list->next;
list->next = p;
list->len++;
return 0;
}
/*
* function: 输出函数
* @param [ in] 头节点
* @param [out]
* @return 成功返回0;失败返回-1;
*/
int output(linklist list)
{
if(list == NULL)
{
printf("输出失败\n");
return -1;
}
linklist p = list;
for(int i = 0; i<list->len;i++)
{
p = p->next;
printf("%d\t",p->data);
}
puts("");
}
/*
* function: we尾部增加
* @param [ in] 头节点
* @param [out]
* @return 成功返回0;失败返回-1
*/
int insert_rear(linklist list,datatype e)
{
if(list == NULL)
{
printf("尾插失败\n");
return -1;
}
linklist p = list;
for(int i = 0;i<list->len;i++)
{
p = p->next;
}
linklist q = create_node();
if(q == NULL)
{
printf("尾插失败\n");
return -1;
}
q->data = e;
p->next = q;
list->len++;
}
/*
* function: 头删除
* @param [ in] 头节点
* @param [out]
* @return 成功返回0,失败返回-1
*/
int delete_head(linklist list)
{
if(list == NULL || list->len == 0)
{
printf("头删除失败");
return -1;
}
linklist p = list->next;
list->next = p->next;
free(p);
p->next = NULL;
list->len--;
return 0;
}
/*
* function: 尾部删除
* @param [ in] 头节点
* @param [out]
* @return 成功返回0;失败返回-1
*/
int delete_rear(linklist list)
{
if(list == NULL || list->len == 0)
{
printf("尾删除失败");
return -1;
}
linklist p = list;
for(int i = 0;i<list->len-1;i++)
{
p = p->next;
}
free(p->next);
p->next = NULL;
list->len--;
}
/*
* function: 按位置插入
* @param [ in] 头节点 位置
* @param [out]
* @return 成功返回0;失败返回-1
*/
int insert_pos(linklist list,int pos,datatype e)
{
if(list == NULL||pos<1||pos >list->len+1)
{
printf("按位置插入失败");
return -1;
}
linklist p =create_node();
linklist q = list;
if(p == NULL)
{
printf("按位置插入失败");
return -1;
}
for(int i = 0;i <pos-1;i++)
{
q = q->next;
}
p->data = e;
p->next = q->next;
q->next = p;
list->len++;
}
/*
* function: 按位置删除
* @param [ in] 位置 头节点
* @param [out]
* @return 成功返回0;失败返回-1
*/
int delete_pos(linklist list,int pos)
{
if(list == NULL||list->len == 0||pos <1||pos>list->len)
{
printf("按位置删除失败");
return -1;
}
linklist p = list;
for(int i = 0 ;i <pos-1;i++)
{
p = p->next;
}
linklist q = p->next;
p->next = q->next;
free(q);
q->next = NULL;
list->len--;
}
/*
* function: 按位置查找
* @param [ in] 头节点,位置
* @param [out]
* @return 成功返回0,失败返回-1;
*/
int search_pos(linklist list,int pos)
{
if(list == NULL||list->len == 0||pos <1||pos>list->len)
{
printf("按位置查找失败");
return -1;
}
linklist p = list;
for(int i = 0;i<pos; i++)
{
p = p->next;
}
printf("要查找的元素是%d\n",p->data);
return 0;
}
/*
* function: 按位置修改
* @param [ in] 头节点,位置,修改元素
* @param [out]
* @return 成功返回0,失败返回-1;
*/
int amend_pos(linklist list,int pos,datatype key)
{
if(list == NULL||list->len == 0||pos <1||pos>list->len)
{
printf("按位置修改失败");
return -1;
}
linklist p = list;
for(int i = 0;i<pos; i++)
{
p = p->next;
}
p->data = key;
return 0;
}
/*
* function: 按元素查找
* @param [ in] 头节点,元素
* @param [out]
* @return 成功返回位置,失败返回-1
*/
int search_data(linklist list,datatype key)
{
if(list == NULL||list->len ==0)
{
printf("按元素查找失败");
return -1;
}
linklist p = list;
int count = 0;
for(int i = 0;i<list->len;i++)
{
p = p->next;
count++;
if(key == p->data)
{
return count;
}
}
return -1;
}
/*
* function: 按元素修改
* @param [ in] 头节点,被修改元素,修改后元素
* @param [out]
* @return 成功返回0;失败返回-1
*/
int amend_data(linklist list,datatype key,datatype e)
{
int pos = search_data(list,key);
if(pos == -1)
{
printf("按元素修改失败\n");
return -1;
}
amend_pos(list,pos ,e);
return 0;
}
/*
* function: 释放空间
* @param [ in] 头节点
* @param [out]
* @return 返回NULL
*/
linklist free_node(linklist list)
{
if(list == NULL || list->len == 0)
return NULL;
for(int i = 0;i<list->len;i++)
{
int flag = delete_head(list);
i--;
if(flag)
return NULL;
}
}
主程序
#include"head.h"
int main(int argc, const char *argv[])
{
//创建头结点
linklist list = create_head();
//输入数据、头插
int n;
datatype e;
printf("请输入数据大小:");
scanf("%d",&n);
for(int i = 0; i<n; i++)
{
printf("请输入元素:");
scanf("%d",&e);
insert_rear(list ,e);
}
output(list);
//tou 头删除
delete_head(list);
output(list);
//尾删除
delete_rear(list);
output(list);
//按位置插入
int pos;
printf("输入插入位置");
scanf("%d",&pos);
printf("请输入插入元素:");
scanf("%d",&e);
insert_pos(list,pos,e);
output(list);
//按位置删除
printf("输入删除位置");
scanf("%d",&pos);
delete_pos(list,pos);
output(list);
//按位置修改
printf("输入修改位置");
scanf("%d",&pos);
datatype key;
printf("请输入修改元素:");
scanf("%d",&key);
amend_pos(list,pos,key);
output(list);
//按元素查找
printf("请输入查找元素:");
scanf("%d",&key);
pos = search_data(list,key);
printf("该元素所在位置:%d\n",pos);
//按元素修改
printf("请输入被修改元素:");
scanf("%d",&key);
printf("请输入修改后元素:");
scanf("%d",&e);
amend_data(list,key,e);
printf("修改后结果:");
output(list);
//释放普通节点
free_node(list);
printf("结果:");
output(list);
//释放头节点
free(list);
list = NULL;
return 0;
}