Lin.h
#ifndef __LIN_H__
#define __LIN_H__
#include
#include
typedef int DateType;
typedef struct node
{
union
{
int len;
DateType date;
};
struct node *next;
}Lin,*LinPtr;
LinPtr create();//创建链表 == 创建头结点
int empty();//判空
//申请节点,封装数据
LinPtr Create_node(DateType e);
//头插
void Head_add(LinPtr A,DateType e);
//遍历
void Show(LinPtr A);
//尾差
void End_add(LinPtr A,DateType e);
//任意位置插入
void Arb_insert(LinPtr A,int num,DateType e);
//头删
void First_delete(LinPtr A);
//尾删
void End_delete(LinPtr A);
//任意位置删除
void Arb_delete(LinPtr A,int num);
//按位置修改
void Arb_revise(LinPtr A,int num,DateType e);
//按值查找返回地址
void Back(LinPtr A,int num);
//反转
void Reverse(LinPtr A);
#endif
Lin.c
#include"Lin.h"
LinPtr create()
{
LinPtr A = (LinPtr)malloc(sizeof(Lin));
if(NULL == A)
{
printf("创建失败!\n");
return NULL;
}
A->next = NULL;
A->len = 0;
printf("创建成功!\n");
return A;
}
int empty(LinPtr A)//判空
{
if(NULL == A)
{
printf("创建失败!\n");
return -1;
}
return A->len == 0;
// return A->next == NULL;
}
//申请节点,封装数据
LinPtr Create_node(DateType e)
{
LinPtr p = (LinPtr)malloc(sizeof(Lin));
if(NULL == p)
{
printf("申请失败!\n");
return NULL;
}
p->date = e;
p->next = NULL;
return p;
}
//头插
void Head_add(LinPtr A,DateType e)
{
if(NULL == A)
{
printf("插入失败!\n");
}
LinPtr p = Create_node(e);
p->next = A->next;
A->next = p;
A->len++;
}
//尾差
void End_add(LinPtr A,DateType e)
{
if(NULL == A)
{
printf("插入失败!\n");
return;
}
LinPtr p = Create_node(e);
LinPtr q = A;
while(q->next != NULL)
{
q = q->next;
}
q->next = p;
A->len++;
}
//遍历
void Show(LinPtr A)
{
if(NULL == A||empty(A))
{
printf("遍历失败!\n");
return;
}
LinPtr p = A;
while(p->next != NULL )
{
p = p->next;
printf("%d ",p->date);
}
putchar(10);
}
//任意位置插入
void Arb_insert(LinPtr A,int num,DateType e)
{
if(NULL == A||num < 1||num > A->len)
{
printf("插入失败!\n");
return;
}
LinPtr p = Create_node(e);
LinPtr q = A;
for(int i=1;i
q = q->next;
}
p->next = q->next;
q->next = p;
A->len++;
}
//头删
void First_delete(LinPtr A)
{
if(NULL == A||empty(A))
{
printf("删除失败!\n");
return;
}
LinPtr p = A;
p = p->next;
A->next = p->next;
A->len--;
free(p);
p == NULL;
}
//尾删
void End_delete(LinPtr A)
{
if(NULL == A||empty(A))
{
printf("删除失败!\n");
return;
}
LinPtr p = A;
for(int i=0;i
{
p = p->next;
}
free(p->next);
p->next = NULL;
A->len--;
}
//任意位置删除
void Arb_delete(LinPtr A,int num)
{
if(NULL == A||empty(A))
{
printf("删除失败!\n");
return;
}
LinPtr p = A;
for(int i=0;i
p = p->next;
}
LinPtr q = p;
q = q->next;
p->next = q->next;
free(q);
q = NULL;
A->len--;
}
//按位置修改
void Arb_revise(LinPtr A,int num,DateType e)
{
if(NULL == A||empty(A))
{
printf("修改失败!\n");
return;
}
LinPtr p = A;
for(int i=0;i
p = p->next;
}
p->date = e;
}
//按值查找返回地址
void Back(LinPtr A,int num)
{
if(NULL == A||empty(A))
{
printf("查找失败!\n");
return;
}
LinPtr p = A;
int n = 1;
for(int i=0;i
{
p = p->next;
if(num == p->date)
{
printf("第%d个位置\n",n);
return;
}
n++;
}
printf("没有该值!\n");
}
//反转
void Reverse(LinPtr A)
{
if(NULL == A||empty(A))
{
printf("反转失败!\n");
return;
}
LinPtr o[A->len];
o[0] = A;
LinPtr p[A->len];
p[0] = A;
LinPtr q[A->len];
q[0] = A;
for(int j=0;j
{
p[j] = p[j]->next;
for(int i=0;i
{
q[j] = q[j]->next;
}
o[j]->next = q[j];
q[j]->next = p[j];
p[j+1] = p[j];
o[j+1] = o[j];
q[j+1] = q[j];
}
}
main.c
#include"Lin.h"
int main()
{
LinPtr A = create();
empty(A);//判空
printf("头插\n");
Head_add(A,10);
Head_add(A,20);
Head_add(A,30);
Head_add(A,40);
Head_add(A,50);
Show(A);
putchar(10);
printf("尾插\n");
End_add(A,10);
End_add(A,20);
End_add(A,30);
End_add(A,40);
End_add(A,50);
End_add(A,60);
Show(A);
putchar(10);
printf("任意位置插入\n");
Arb_insert(A,1,60);
Show(A);
putchar(10);
printf("头删\n");
Head_add(A,1);
Show(A);
First_delete(A);
Show(A);
putchar(10);
printf("尾删\n");
End_add(A,1);
Show(A);
End_delete(A);
Show(A);
putchar(10);
printf("任意位置删除\n");
Arb_insert(A,5,66);
Show(A);
Arb_delete(A,5);
Show(A);
putchar(10);
printf("按位置修改\n");
Arb_revise(A,2,66);
Show(A);
Arb_revise(A,2,50);
Show(A);
putchar(10);
printf("安值查找'10'的返回地址\n");
Back(A,10);
Show(A);
putchar(10);
printf("反转\n");
Arb_insert(A,1,11);
Arb_insert(A,2,22);
Arb_insert(A,3,33);
Show(A);
Reverse(A);
Show(A);
putchar(10);
}