单链表(C语言)
Status init_Link(&L); 初始化操作
Status hCreate(&L,n); 头插
Status rCreate(&L,n); 尾插
ElemType get_Link(&L,i); 按位取元素
Status delete_Link(&L,i); 删除
Status empty_Link(&L); 判空
LinkList.h
/*
*项目名: LinkList
*文件名: LinkList.h
*创建者: CaoPengCheng
*创建时间:2021-3-24
*描述: 单链表
*函数:
Status init_Link(&L); 初始化操作
Status hCreate(&L,n); 头插
Status rCreate(&L,n); 尾插
ElemType get_Link(&L,i); 按位取元素
Status delete_Link(&L,i); 删除
Status empty_Link(&L); 判空
*/
#include "stdio.h"
#include "stdlib.h"
#define ElemType int
#define Status int
#define OK 1
#define ERROE 0
typedef struct LNode{
ElemType data;
struct LNode *next;
}LinkList;
//初始化空表
Status init_Link(LinkList *L){
//LinkList *p=L;
L=(LinkList *) malloc (sizeof(LinkList));
L->next=NULL;
//printf("OK\n");
//printf("\n\n%d \n\n",p->next);
return OK;
}
//头插建立单链表
Status hCreate(LinkList *L,int n){
LinkList *p,*q;
int i;
init_Link(L);
q=L;
for(i=1;i<=n;i++){
p=(LinkList *) malloc (sizeof(LinkList));
//scanf("%d",&p->data);
p->data=i;
p->next=q->next;
q->next=p;
}
return OK;
}
Status hCreateNoInit(LinkList *L,int n){
LinkList *p,*q;
int i;
q=L;
for(i=1;i<=n;i++){
p=(LinkList *) malloc (sizeof(LinkList));
//scanf("%d",&p->data);
p->data=i;
p->next=q->next;
q->next=p;
}
return OK;
}
//尾插建立单链表
Status rCreate(LinkList *L,int n){
LinkList *p,*q;
int i;
init_Link(L);
q=L;
for(i=1;i<=n;i++){
p=(LinkList *) malloc (sizeof(LinkList));
//scanf("%d",&p->data);
p->data=i;
p->next=q->next;
q->next=p;
q=p;
}
return OK;
}
//插入数据
Status insert_Link(LinkList *L,int i,ElemType e){
LinkList *p,*q;
int j;
p=L->next;
for(j=1;(int)p->next != -858993460;j++){
//j+1 为插入位置的前一项
if(i==(j+1)){
q=(LinkList *) malloc (sizeof(LinkList));
q->data=e;
q->next=p->next;
p->next=q;
break;
}
p=p->next;
}
return OK;
}
//取元素
ElemType get_Link(LinkList *L,int i){
LinkList *p;
int j=0;
p=L;
while(j<i && (int)p->next != -858993460){
p=p->next;
j=j+1;
}
return p->data;
}
//删除
Status delete_Link(LinkList *L,int i){
LinkList *p,*q;
int j;
p=L->next;
for(j=1;(int)p->next != -858993460;j++){
//j+1 为插入位置的前一项
if(i==(j+1)){
q=p->next;
p->next=p->next->next;
break;
}
p=p->next;
}
free(q);
return OK;
}
//判表空
Status empty_Link(LinkList *L){
if(L->next==NULL)
return OK;
else
return ERROE;
}
//求表长
int len_Link(LinkList *L){
int i=0;
LinkList *p;
p=L;
while((int)p->next != -858993460){
p=p->next;
i++;
}
return i;
}
//输出所有数据
void peint_Link(LinkList *L){
LinkList *q;
q=L;
while((int)q->next != -858993460){
q=q->next;
printf("%d ",q->data);
}
printf("\n");
}
测试
Status LinkTest(){
LinkList *La,pa,*Lb,pb,*L,p;
int i;
La=&pa;
Lb=&pb;
L=&p;
init_Link(L);
printf("头插测试-La:");
hCreate(La,4);
for(i=1;i<=4;i++)
printf("%d ",get_Link(La,i));
printf("\n");
printf("尾插测试-Lb:");
rCreate(Lb,4);
for(i=1;i<=4;i++)
printf("%d ",get_Link(Lb,i));
printf("\n");
printf("插入测试-La:");
insert_Link(La,3,99);
for(i=1;i<=5;i++)
printf("%d ",get_Link(La,i));
printf("\n");
printf("删除测试-Lb:");
delete_Link(Lb,3);
for(i=1;i<=3;i++)
printf("%d ",get_Link(Lb,i));
printf("\n");
printf("判空测试-L:");
if(empty_Link(L))
printf("非空\n");
else
printf("空\n");
printf("输出测试-La:");
peint_Link(La);
return OK;
}