目录
对之前博客的完善,之前是根据课本看着打的
Common.h
不带头结点的版本
带头结点的版本
对之前的博客的完善,之前是根据课本看着打的
Common.h
#ifndef COMMON_H
#define COMMON_H
#include<stdio.h>
#include<stdlib.h>
#define bool int
#define true 1
#define false 0
#endif
不带头结点的版本
#include "E:\C\Common.h"
//不带头结点的单链表
typedef struct LNode{
int data;
struct LNode*next;
}LNode,*LinkList;
// 初始化一个空的的单链表
bool InitList(LinkList*L){
*L=NULL;
return true;
}
//头插法
LinkList List_HeadInsert(LinkList*L,int e){
LNode*s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=*L;
*L=s;
return *L;
}
// 尾插法
LinkList List_TailInsert(LinkList*L,int e){
if(*L==NULL){
*L=(LNode*)malloc(sizeof(LNode));
(*L)->data=e;
(*L)->next=NULL;
return (*L);
}
LNode*s=*L;
while(s->next){
s=s->next;
}
LNode*p=(LNode*)malloc(sizeof(LNode));
p->data=e;
p->next=NULL;
s->next=p;
return *L;
}
// 按位序插入
bool LinkListInsert(LinkList*L,int i,int e){
if(i<1) return false;
if(i==1){
LNode*s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=*L;
*L=s;
return true;
}
LNode*p=(*L);
int j=1;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL) return false;
LNode*s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
// 销毁
bool DestroyList(LinkList*L){
LNode*p;
while(*L){
p=(*L)->next;
free(*L);
(*L)=p;
}
free(p);
*L=NULL;
return true;
}
// 遍历
void ListTraver(LinkList L){
LNode*p=L;
while(p){
printf("%d ",p->data);
p=p->next;
}
free(p);
printf("\n");
}
// 按位序删除
bool ListDelete(LinkList*L,int i,int*e){
if(i<1) return false;
if(i==1){
LNode*p=(*L)->next;
*e=(*L)->data;
free(*L);
(*L)=p;
return true;
}
LNode*p=(*L);
int j=1;
while(p->next!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL) return false;
LNode*q=p->next;
*e=q->data;
p->next=q->next;
free(q);
return true;
}
带头结点的版本
#include "E:\C\Common.h"
#define Elemtype int
//带头结点的单链表
typedef struct LNode{
Elemtype data;
struct LNode*next;
}LNode,*LinkList;
// 初始化一个空的的单链表
bool InitList(LinkList*L){
*L=(LinkList)malloc(sizeof(LNode));
if(L==NULL) return false;
(*L)->next=NULL;
return true;
}
// 头插法 用于逆置
bool List_HeadInsert(LinkList*L, Elemtype e){
if((*L)==NULL) return false;
LNode*node=(LNode*)malloc(sizeof(LNode));
node->data=e;
node->next=(*L)->next;
(*L)->next=node;
return true;
}
// 尾插法,可以考虑设置一个指向表尾结点的指针
bool List_TailInsert(LinkList*L, Elemtype e){
if((*L)==NULL) return false;
LNode*node=(*L);
while(node->next){
node=node->next;
}
node->next=(LNode*)malloc(sizeof(LNode));
node->next->data=e;
node->next->next=NULL;
return true;
}
// 按位序插入
bool ListListInsert(LinkList*L,int i, Elemtype e){
if(i<1) return false;//超出范围
LNode*p=(*L);
int j=0; //当前p指向第几个结点
while(p&&j<i-1){
p=p->next;
j++;
}
if(p==NULL||j>i-1) return false;//i值不合理,超出范围
LNode*s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
// 按位序删除
bool ListDelete(LinkList*L,int i, Elemtype*e){
if(i<1) return false;
LNode*p=(*L);
int j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL||p->next==NULL||j>i-1) return false;
LNode*q=p->next;
*e=q->data;
p->next=q->next;
free(q);
return true;
}
// 销毁
bool DestroyList(LinkList*L){
LNode*p;
while(*L){
p=(*L)->next;
free(*L);
(*L)=p;
}
free(p);
*L=NULL;
return true;
}
// 遍历
void ListTraver(LinkList L){
LNode*p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
free(p);
printf("\n");
}
// 按位查找
LNode*GetElem(LinkList*L,int i){
if(i<1)
return NULL;
LNode*p=(*L);
int j=0;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
// 按值查找
LNode*LocateElem(LinkList*L, Elemtype e){
LNode*p=(*L)->next;
while (p!=NULL&&p->data!=e)
{
p=p->next;
}
return p; //找到后返回该结点指针
}