linkList.h
linkList.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.h>
#include<stdlib.h>
//类型重定义,用于存储数据的类型
typedef int DataType;
//定义一个节点的结构体类型
typedef struct Node
{
union
{
int len;
DataType data;
};
struct Node *next;
}linkList,*linkListPtr;
linkListPtr link_create();//创建链表
int empty(linkListPtr H);//链表判空
linkListPtr create_node(DataType e);//申请节点,封装数据
//头插
int head_add(linkListPtr H,DataType e);
//遍历,打印输出链表每个节点数据域的值
void show(linkListPtr H);
int tail_add(linkListPtr H,DataType e);//尾插
int idex_add(linkListPtr H,DataType e,int idex);//任意位置插入
int head_del(linkListPtr H);//头删
int tail_del(linkListPtr H);//尾删
int idex_del(linkListPtr H,int idex);//任意位置删除
int idex_change(linkListPtr H,DataType e,int idex);//按位置修改
int val_change(linkListPtr H,DataType e,int value);//按值修改
linkListPtr val_search(linkListPtr H,int value);//按值查找
void rev(linkListPtr H);//反转
void free_list(linkListPtr H);//销毁链表
#endif
linkList.c
#include"linkList.h"
linkListPtr link_create()
{
//堆区申请空间
linkListPtr H = (linkListPtr)malloc(sizeof(linkList));
if(NULL == H)
{
printf("创建链表失败\n");
return NULL;
}
//申请成功,将头结点的数据域归0,指针域指向NULL
H->len = 0;
H->next = NULL;
printf("创建链表成功\n");
return H;
}
//判空
int empty(linkListPtr H)
{
if(NULL == H)
{
printf("判空失败!\n");
return -1;
}
return H->len == 0;
//return H->next == NULL;
}
//申请节点,封装数据
linkListPtr create_node(DataType e)
{
linkListPtr p = (linkListPtr)malloc(sizeof(linkList));
if(NULL==p)
{
printf("申请节点失败\n");
return NULL;
}
p->data = e;
p->next = NULL;
return p;
}
//头插
int head_add(linkListPtr H,DataType e)
{
if(NULL == H)
{
printf("头插失败!\n");
return 0;
}
linkListPtr p = create_node(e);
p->next = H->next;
H->next = p;
H->len++;
return 1;
}
//遍历
void show(linkListPtr H)
{
if(NULL==H || empty(H))
{
printf("遍历失败!\n");
return;
}
//定义一个遍历的指针
linkListPtr q = H;
for(int i=0;i<H->len;i++)
{
q = q->next;
printf("%d ",q->data);
}
printf("\n");
}
//尾插
int tail_add(linkListPtr H,DataType e)
{
if(NULL==H)
{
printf("尾插失败!\n");
return 0;
}
linkListPtr p = create_node(e);
linkListPtr q = H;
for(int i=0;i<H->len;i++)
{
q = q->next;
}
//尾插
q->next = p;
H->len++;
}
int idex_add(linkListPtr H,DataType e,int idex)
{
if(NULL == H || idex<1 ||idex>H->len+1)
{
printf("插入失败!\n");
return 0;
}
linkListPtr p = create_node(e);
linkListPtr q = H;
for(int i=0;i<idex-1;i++)
{
q = q->next;
}
//插入
p->next = q->next;
q->next = p;
H->len++;
return 1;
}
//头删
int head_del(linkListPtr H)
{
if(NULL == H || empty(H))
{
printf("头删失败");
return 0;
}
linkListPtr q = H->next;
H->next = H->next->next;
free(q);
q = NULL;
H->len--;
return 1;
}
int tail_del(linkListPtr H)
{
if(NULL == H || empty(H))
{
printf("尾删失败!\n");
return 0;
}
linkListPtr q = H;
for(int i=0;i<H->len-1;i++)
{
q = q->next;
}
linkListPtr p = q->next;//最后一个节点
q->next = p->next;
free(p);
p = NULL;//避免野指针
H->len--;
return 1;
}
int idex_del(linkListPtr H,int idex)
{
if(NULL==H || empty(H) || idex<1 ||idex>H->len )
{
printf("删除失败!\n");
return 0;
}
linkListPtr q = H;//定义要删除的节点的前一个节点
for(int i=0;i<idex-1;i++)
{
q = q->next;
}
linkListPtr p = q->next;//要删除的节点
q->next = p->next;
free(p);
p = NULL;
H->len--;
return 1;
}
//按位置修改
int idex_change(linkListPtr H,DataType e,int idex)
{
if(NULL==H || empty(H) || idex<1 || idex>H->len)
{
printf("修改失败!\n");
return 0;
}
linkListPtr p = H;
for(int i=0;i<idex;i++)
{
p = p->next;
}
if(p->data == e)
{
return 0;
}
p->data = e;
return 1;
}
//按值修改
int val_change(linkListPtr H,DataType e,int value)
{
if(NULL==H || empty(H))
{
printf("修改失败!\n");
return 0;
}
linkListPtr p = H;
for(int i=0;i<H->len;i++)
{
p = p->next;
if(p->data == value)
{
p->data = e;
}
}
return 1;
}
//按值查找
linkListPtr val_search(linkListPtr H,int value)
{
if(NULL==H || empty(H))
{
printf("查找失败!\n");
return NULL;
}
linkListPtr p = H;
for(int i=0;i<H->len;i++)
{
p = p->next;
if(p->data == value)
{
return p;
}
}
}
void rev(linkListPtr H)
{
if(NULL==H || NULL==H->next)//判断链表是否合法,头结点的指针域
return;
//定义两个指针,分别指向头节点的指针域和第一个普通节点的指针域
linkListPtr p = H->next;
linkListPtr q = H->next->next;
while(q!=NULL)
{
p->next = q->next;//把p的指针域移向q的指针域
q->next = H->next;//把q的指针域移向头结点的指针域
H->next = q;//把头结点的指针域指向q
q = p->next;//把q指向p的指针域
}
}
//销毁链表
void free_list(linkListPtr H)
{
if(NULL== H)
{
printf("销毁失败!\n");
return;
}
linkListPtr p = H;
while(p)
{
H = H->next;
free(p);
p = H;
}
printf("销毁成功!\n");
}
main.c
#include "linkList.h"
int main()
{
//创建链表
linkListPtr H = link_create();
//头插
head_add(H, 10);
head_add(H, 20);
head_add(H, 30);
head_add(H, 40);
head_add(H, 50);
show(H); //遍历
tail_add(H, 1); //尾插
tail_add(H, 2);
tail_add(H, 3);
tail_add(H, 4);
tail_add(H, 5);
show(H);
idex_add(H,55,2); //任意位置插入
show(H);
head_del(H); //头删
show(H);
tail_del(H);//尾删
show(H);
idex_del(H,3);//任意位置删除
show(H);
idex_change(H,100,2);//按位置修改
show(H);
val_change(H,300,20);//按值修改
show(H);
//按值查找
printf("查找到链表中值1的地址是%p\n",val_search(H,1));//按值查找
rev(H);//链表反转
show(H);
free_list(H);
}
运行截图