也是跨考408备考期间自己练习的代码,试验过的,可行!!
因为是链表,所以结点定义包括指针域和数据域,定义如下
typedef int ElemType ;
typedef struct LNode{ // 定义结点
ElemType data ; //数据域
LNode *next ; //指针域
}LNode,*LinkList ;
因为不带头结点的链表相对比较困难,考研考到概率不大,所以只写了带头结点的定义
bool InitList(LinkList &L){ //带头结点链表初始化
L=(LNode *)malloc(sizeof(LNode)) ; //LNode*是结构体指针 和 LinkList完全等价
L->next= nullptr ;
return true ;
}
链表查找分为按值查找和按位查找,考验中都有涉及
void LocateElem(LinkList L ,int i){ //按位查找 找第i位元素
LNode *p=L ; //指针p记录当前访问结点
int j=0 ;
int k ;
while(p!= nullptr && j<i){
p=p->next ;
j++ ;
}
if(p== nullptr || j>i){ //链表p为空否则链表长度过短
printf("nullptr\n");} //第i个元素不存在
else{
k=p->data; //取第i个元素的数据
printf("%d\n",k);
}
}
void GetElem(LinkList L ,ElemType x){ //按值查找 找值为x的元素
int len=0 ;
LNode *p=L->next ;
while (p!= nullptr && p->data!=x){
p=p->next ;
len++ ; //计数器原理
}
if(p== nullptr){
printf("nullptr\n") ;
} else{
printf("exist element , pos=%d\n",len) ;
}
}
之后是插入(不是头插和尾插)和删除结点的代码
(头插法和尾插法下次单独写)
bool ListInsert(LinkList &L,int i,ElemType x){ //一般插入结点方法 将值为x的结点插入第i位
LNode *p=L ;
int j=0 ;
while(p!= nullptr && j<i-1){
p=p->next ;
j++ ;
}
if(p== nullptr){
return false ;
}
LNode *s=(LNode *)malloc(sizeof(LNode)) ;
s->data=x ; //注意顺序 必须在 p->next=s ;之前
s->next=p->next ;
p->next=s ; //注意顺序 必须在 s->data=x ;之后
return true ;
}
void ListDelete(LinkList &L,int i,ElemType &e){ //删除第i个结点,用e返回
LNode *p=L ;
int j=0 ;
while(p!= nullptr && j<i-1){
p=p->next ;
j++ ;
}
if(p== nullptr || p->next== nullptr){
printf("not find\n") ;
return ;
}
LNode *q=p->next ;
e=q->data ;
p->next=q->next ;
free(q) ;
printf("delete success\n") ;
return ;
}
最后是打印链表定义
void PrintList(LinkList L){
L=L->next ;
while (L!= nullptr){
printf("%3d" ,L->data) ; //打在一行,空三格
L=L->next ;
}
printf("\n") ;
}
最后,链表综合操作代码如下:
#include <stdio.h>
#include <stdlib.h> //malloc申请的头文件
typedef int ElemType ;
typedef struct LNode{ // 定义结点
ElemType data ;
LNode *next ;
}LNode,*LinkList ;
bool InitList(LinkList &L){ //带头结点初始化
L=(LNode *)malloc(sizeof(LNode)) ; //LNode*是结构体指针 和 LinkList完全等价
L->next= nullptr ;
return true ;
}
//bool InitList(LinkList &L){ //不带头结点链表初始化定义,不考
// L=NULL ;
// return true ;
//}
void LocateElem(LinkList L ,int i){ //按位查找 找第i位元素
LNode *p=L ; //指针p记录当前访问结点
int j=0 ;
int k ;
while(p!= nullptr && j<i){
p=p->next ;
j++ ;
}
if(p== nullptr || j>i){ //链表p为空否则链表长度过短
printf("第i个元素不存在\n");} //第i个元素不存在
else{
k=p->data; //取第i个元素的数据
printf("%d\n",k);
}
}
void GetElem(LinkList L ,ElemType x){ //按值查找 找值为x的元素
int len=0 ;
LNode *p=L->next ;
while (p!= nullptr && p->data!=x){
p=p->next ;
len++ ; //计数器原理
}
if(p== nullptr){
printf("不可查\n") ;
} else{
printf("存在该值,在第%d位\n",len) ;
}
}
bool ListInsert(LinkList &L,int i,ElemType x){ //一般插入结点方法 将值为x的结点插入第i位
LNode *p=L ;
int j=0 ;
while(p!= nullptr && j<i-1){ //第i位下标是i-1
p=p->next ;
j++ ;
}
if(p== nullptr){
return false ;
}
LNode *s=(LNode *)malloc(sizeof(LNode)) ;
s->data=x ; //注意顺序 必须在 p->next=s ;之前
s->next=p->next ;
p->next=s ; //注意顺序 必须在 s->data=x ;之后
return true ;
}
void ListDelete(LinkList &L,int i,ElemType &e){ //删除第i个结点,用e返回
LNode *p=L ;
int j=0 ;
while(p!= nullptr && j<i-1){
p=p->next ;
j++ ;
}
if(p== nullptr || p->next== nullptr){
printf("没有该结点") ;
return ;
}
LNode *q=p->next ;
e=q->data ;
p->next=q->next ;
free(q) ;
printf("删除成功") ;
return ;
}
void PrintList(LinkList L){
L=L->next ;
while (L!= nullptr){
printf("%3d" ,L->data) ; //打在一行,空三格
L=L->next ;
}
printf("\n") ;
}
int main(){ //链表的初始化 一般插入 删除 查找(按位、按值)
LinkList L; //声明链表L
InitList(L) ; //初始化链表 建立一个头结点
printf("********************************************************************\n") ;
ListInsert(L,1,4) ;
ListInsert(L,2,8) ;
ListInsert(L,3,6) ;
ListInsert(L,4,2) ;
ListInsert(L,5,9) ; //给链表赋值
PrintList(L) ; //打印链表L
printf("********************************************************************\n") ;
GetElem(L,2) ; //按值查找 查值为2的结点 可查
GetElem(L,5) ; //查值为5的结点 查不到
printf("********************************************************************\n") ;
LocateElem(L,3) ; //按位查找 查第3位结点 可查
LocateElem(L,8) ; //查第8位结点 查不到
printf("********************************************************************\n") ;
ElemType del ;
ListDelete(L,4,del) ; //删除第4位元素 用del返回
PrintList(L) ;
ListDelete(L,5,del) ; //若交换删除顺序,会删除两个元素
PrintList(L) ;
printf("********************************************************************\n") ;
return 0;
}