head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 ,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 find_pos(linklist L,datatype e);
int updata_pos(linklist L,int pos,datatype e);
int element_chang(linklist L,datatype key,datatype e);
int element_insert(linklist L,datatype key,datatype e);
int element_delete(linklist L,datatype key);
void rev_linklist(linklist L);
#endif
test.c
#include "head.h"
/*
* function: 创建节点
* @param [ in]
* @param [out] 1表示创建头节点,0表示创建普通节点
* @return 成功返回首地址,失败NULL
*/
linklist create_node(int flag){
linklist L=(linklist)malloc(sizeof(struct Node));
if(NULL==L)return NULL;
//对L节点的初始化
if(flag==1)//对L节点数据域清空
L->len=0;
else if(flag==0)
L->data=0;
L->next=NULL;//将L的指针域指向NULL
return L;
}
/*
* function: 头插
* @param [ in]
* @param [out] 头结点 值
* @return 成功返回0,失败-1
*/
int insert_head(linklist L,datatype e){
if(NULL==L)return -1;
linklist s=create_node(0);
if(NULL==s)return -1;
//s的数据域
s->data=e;
s->next=L->next;
L->next=s;
L->len++;
return 0;
}
/*
* function: 输出
* @param [ in]
* @param [out] 链表*L
* @return 无
*/
void output(linklist L){
if(NULL==L || L->next==NULL)return;
linklist p=L;
//根据链表长度len
#if 0
for(int i=0;i<L->len;i++){
p=p->next;
printf("%d\t",p->data);
}
#endif
#if 1
//根据NULL
while(p->next!=NULL){
p=p->next;
printf("%d\t",p->data);
}
#endif
puts("");
}
/*
* function: 尾插
* @param [ in] 头节点L,插入的值
* @param [out] 尾节点
* @return 返回尾节点
*/
linklist insert_rear(linklist L,datatype e,linklist rear){
if(NULL==L)return NULL;
linklist s=create_node(0);
if(NULL==s)return NULL;
s->data=e;
rear->next=s;//从尾节点插入
L->len++;
rear=s;
return rear;
}
/*
* function: 头删除
* @param [ in] 链表
* @param [out]
* @return 成功0,失败-1
*/
int delete_head(linklist L){
if(NULL==L || NULL ==L->next)return -1;
linklist q=L->next;
L->next=q->next;
free(q);
q=NULL;
L->len--;
return 0;
}
/*
* function: 尾部删除
* @param [ in] 链表
* @param [out]
* @return 成功0;失败-1
*/
int delete_rear(linklist L){
if(NULL==L || NULL ==L->next)return -1;
linklist p=L;
while(p->next->next!=NULL){//将p移动到尾节点的上一个节点
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(NULL==L || L->next==NULL || pos<1 || pos>L->len+1)return -1;
linklist p=L;
for(int i=0;i<pos-1;i++){
p=p->next;
}
linklist s=create_node(0);
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(NULL==L || pos<1 || pos>L->len)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;
return 0;
}
/*
* function: 查找值
* @param [ in] 链表 要找的值
* @param [out]
* @return 成功返回节点地址,失败返回-1
*/
int find_pos(linklist L,datatype e){
if(NULL==L || NULL==L->next)return -1;
linklist p=L;
for(int i=1;i<L->len+1;i++){
p=p->next;
if(p->data==e)
return i;
}
return -1;
}
/*
* function: 任意位置修改
* @param [ in] 链表 位置 修改后的值
* @param [out]
* @return 成功0;失败-1;
*/
int updata_pos(linklist L,int pos,datatype e){
if(NULL==L || NULL==L->next)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 element_chang(linklist L,datatype key,datatype e){
if(NULL==L || NULL==L->next)return -1;
int sub=find_pos(L,key);
if(sub=-1)return -1;
updata_pos(L,sub,e);
return 0;
}
/*
* function: 按元素插入
* @param [ in] 链表 要修改的值 修改后的值
* @param [out]
* @return 成功0;失败-1
*/
int element_insert(linklist L,datatype key,datatype e){
if(NULL==L || NULL==L->next)return -1;
int sub=find_pos(L,key);
if(sub=-1)return -1;
insert_pos(L,sub,e);
return 0;
}
/*
* function: 按元素删除
* @param [ in]
* @param [out]
* @return
*/
int element_delete(linklist L,datatype key){
if(NULL==L || NULL==L->next)return -1;
int sub=find_pos(L,key);
if(sub=-1)return -1;
delete_pos(L,sub);
return -1;
}
/*
* function: 单列表逆至
* @param [ in] 列表
* @param [out]
* @return
*/
void rev_linklist(linklist L){
if(NULL==L || NULL==L->next)return;
linklist p=L->next;
L->next=NULL;
while(p!=NULL){
linklist t=p;
p=p->next;
L->next=t;
}
}
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
int flag=0;
linklist L=create_node(flag);
int n=0;
linklist rear=L;//定义尾节点
printf("插入个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
datatype e;
printf("%d.输入插入的值:",i);
scanf("%d",&e);
//insert_head(L,e);
rear=insert_rear(L,e,rear);
}
output(L);
/*
//头删除
delete_head(L);
delete_head(L);
delete_head(L);
//尾删除
delete_rear(L);
*/
//任意位置插入
int pos=0;//下标
datatype e=0;//值
printf("输入插入的位置和插入的值:");
scanf("%d %d",&pos,&e);
insert_pos(L,pos,e);
output(L);
//任意位置删除
printf("删除的位置:");
scanf("%d",&pos);
delete_pos(L,pos);
output(L);
//查找值
printf("查找的值");
scanf("%d",&e);
pos=find_pos(L,e);
printf("位置是%d\n",pos);
//任意位置修改;
printf("位置和修改后的值:");
scanf("%d %d",&pos,&e);
updata_pos(L,pos,e);
output(L);
//按元素修改
datatype key;
printf("输入要修改的值和改之后的值");
scanf("%d %d",&key,&e);
//element_chang(L,key,e);
//element_insert(L,key,e); //按元素插入
element_delete(L,key);//按元素删除
output(L);
//单列表逆至
rev_linklist(L);
output(L);
return 0;
}