一、单链表的基本操作(涉及C++)
涉及C++的部分主要是当需要修改单链表的时候,到底是不使用C++的语法从而通过传递头指针的指针(二级指针)来实现对链表的修改,还是使用C++的语法而通过取头指针的引用(&L)来实现对链表的修改,本文采用了第二种方法,第一种方法也行,不过当要修改头指针的时候需要使用取值运算符*,而且还要用括号单独括起来才不会出错,显然比较麻烦,第二种注意文件名后缀必须为.cpp否则会报错。
二、代码展示
//注意点:&表示引用,传参的时候不需要带符号,引用后的变量和实参一致,修改形参即可修改实参
//单链表的基本操作
#include <stdio.h>
#include <stdlib.h>
//1.单链表的点定义
typedef struct LNode{
int year;
struct LNode *next;
}LNode,*LinkList;
//2.单链表的创建(头插法)
LinkList ListHeadInsert(LinkList &L){
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
printf("success\n");
while(x!=999){
s=(LNode*)malloc(sizeof(LNode));
s->year=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
printf("success\n");
}
return L;
}
//3.单链表的创建(尾插法)
LinkList ListTailInsert(LinkList &L){
LNode *r,*s;
int x,count=0;
L=(LinkList)malloc(sizeof(LNode));
r=L;
L->next=NULL;
scanf("%d",&x);
while(x!=999){
s=(LNode*)malloc(sizeof(LNode));//创建新节点并使得指针s指向新节点
s->year=x;
r->next=s;
r=s;
printf("第%d条数据加入成功\n\n",++count);
scanf("%d",&x);
}
r->next=NULL;
printf("单链表创建完成,长度为%d\n",count);
return L;
}
//4.单链表的按序号(位序)查找法
LNode* GetElem(LinkList L,int i){
if(i<-1)
return NULL;//返回值类型为指针,不是bool值
LNode *p=L->next;//定义指针指向第一个元素
for(int j=1;j<i&&p!=NULL;j++){
p=p->next;
}
return p;
}
//5.单链表的按值查找
LNode* LocateElem(LinkList L,int e){
LNode *p=L->next;
while(p->year!=e&&p!=NULL){
p=p->next;
}
return p;
}
//6.单链表的插入结点操作(按位序插入,前插法)
bool Insert(LinkList &L,int year,int i){
if(i<1){
return false;
}
LNode *prev=GetElem(L,i-1);//寻找被插入位置的前驱结点
LNode *s=(LNode*)malloc(sizeof(LNode));//创建新结点
s->year=year;
s->next=prev->next;
prev->next=s;
return true;
}
//7.打印单链表的全部数据
void PrinList(LinkList L){
int count=1;
while(L->next!=NULL){
L=L->next;
printf("第%d条数据为:%d\n",count++,L->year);
}
}
//8.单链表的插入结点操作(后插法)
bool TailInsert(LinkList L,int year,int i){
if(i<1)
return false;
LNode *p=GetElem(L,i);
LNode *s=(LNode*)malloc(sizeof(LNode));
s->year=year;
s->next=p->next;
p->next=s;
return true;
}
//9.单链表的删除操作
bool Del(LinkList &L,int i){
if(i<1)
return false;
LNode *prev=GetElem(L,i-1);
LNode *del=prev->next;
prev->next=prev->next->next;//或者prev->next=del->next
free(del);
return true;
}
//10.求解单链表表长
int ListLength(LinkList L){
int count=0;
while(L->next!=NULL){
L=L->next;
count++;
}
return count;
}
//主函数
int main(){
LinkList L;
int year,i;
//1.采用尾插法创建单链表也可采用头插法创建单链表,只不过顺序会与输入的顺序相反
L=ListTailInsert(L);
//2.按位序查找,此句查找位序为2的结点,返回值是结点位序为2的指针,如果i不在合理范围返回NULL
printf("查询值为%d",GetElem(L,2)->year);
//3.按值查找,返回值为指向该值所在的结点,如果未找到返回NULL
printf("查询值为%d",LocateElem(L,89)->year);
printf("请输入需要插入的年纪和位序\n");
scanf("%d",&year);
scanf("%d",&i);
//4.插入结点,前插法,如在位序为2插入一个结点,则新结点为2,后插法则新结点位序为3
if(Insert(L,year,i))
printf("插入成功!\n");
PrinList(L);
printf("请输入需要删除的位序\n");
scanf("%d",&i);
//5.按位序删除结点
if(Del(L,i))
printf("删除成功!\n");
//6.按位序从小到大打印单链表的全部数据
PrinList(L);
//7.求表长,返回值为int型
printf("表长为%d\n",ListLength(L));
return 0;
}