定义单链表结点类型
#include<stdio.h>
//定义单链表结点类型
typedef struct LNode{
int data; //结点的数据域
LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
单链表的初始化
//单链表的初始化
void InitList(LinkList &L){
L=new LNode;//分配一个头结点 或L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
判断链表是否为空
//判断链表是否为空
bool ListEmpty(LinkList L){
if(L->next==NULL) //判断头结点指针域是否为空
return true;
else
return false;
}
销毁单链表
//销毁单链表
void DestroyList(LinkList &L){
LNode *p;//或LinkList p;
while(L){
p=L;
L=L->next;
delete p;
}
}
清空单链表(只留头结点)
//清空单链表(只留头结点)
void ClearList(LinkList &L){
LNode *p,*q;//或LinkList p,q;
p=L->next; //p指向要删除的结点
while(p){
q=p->next; //q指向要删除的下一个结点
delete p;
p=q;
}
L->next=NULL;
}
求表的长度(从首元结点开始算,头结点不算)
//求表的长度(从首元结点开始算,头结点不算)
int ListLength(LinkList L){
int length=0;
LNode *p;
p=L->next;
while(p){
length++;
p=p->next;
}
return length;
}
取值(取第i个元素)
//取值(取第i个元素)
bool GetElem(LinkList L,int i,int &e){
LNode *p; //指针p指向当前扫描到的结点
int j=1; //当前p指向的是第几个结点
p=L->next; //初始化,p指向首元结点
while(p && j<i)//向后扫描,直到p指向第i个元素或p为空
{
p=p->next;
++j;
}
if(!p || j>i) return false; //i值不合法i>n或i≤0
e=p->data;
return true;
}
遍历
// 遍历
void PrintList(LinkList L){
for(int i=0;i<ListLength(L);i++){
int e;
GetElem(L,i+1,e);
printf("第%d个元素的值=%d\n",i+1,e);
}
}
按值查找---返回指向包含这个值的结点的指针
//按值查找---返回指向包含这个值的结点的指针
LNode *LocateElem(LinkList L,int e){
LNode *p=L->next;
//从第1个结点开始查找数据域为e的结点
while(p && p->data!=e)
p=p->next;
return p; //找到后返回该结点指针,否则返回NULL
}
按值查找---返回包含这个值的结点的位置序号
//按值查找---返回包含这个值的结点的位置序号
int Locate(LinkList L,int e){
LNode *p=L->next;
int i=1;
while(p && p->data!=e){
p=p->next;i++;
}
if(p) return i;
else return -1; //没有找到返回-1
}
在第i个位置插入元素e
//在第i个位置插入元素e
bool ListInsert(LinkList &L,int i,int e){
LNode *p=L; //p指向头结点
int j=0;
while(p && j<i-1){ //查找第i-1个结点,p指向该结点
p=p->next;++j;
}
if(!p || j>i-1) return false; //i>n+1或i<1,插入位置不合法
LNode *s=new LNode;
s->data=e;
s->next=p->next;
p->next=s; //将新结点s连到p之后
return true; //插入成功
}
删除第i个元素
//删除第i个元素
bool ListDelete(LinkList &L,int i, int &e){
LNode *p=L;int j=0;
while(p->next && j<i-1){ //查找第i-1个结点,p指向该结点
p=p->next;++j;
}
if(!(p->next) || j>i-1) return false; //i>n或i<1,删除位置不合法
LNode *q=p->next;//令q指向被删除结点
e=q->data; //用e返回元素的值
p->next=q->next; //改变删除结点前驱结点的指针域
delete(q);
return true;
}
头插法建立单链表(逆序排序)
//头插法建立单链表(逆序排序)
void CreateList_H(LinkList &L,int n){
L=new LNode; //新建头结点
L->next=NULL;
for(int i=0;i<n;++i){
LNode *p=new LNode;
printf("请输入第%d个值:",i+1);
scanf("%d",&p->data);
p->next=L->next; //插入到表头
L->next=p;
}
}
尾插法建立单链表(顺序排序)
//尾插法建立单链表(顺序排序)
void CreateList_R(LinkList &L,int n){
L=new LNode;//新建头结点
L->next=NULL;
LNode *r=L; //尾指针:最开始指向头结点,然后慢慢向后移
for(int i=0;i<n;++i){
LNode *p=new LNode;
printf("请输入第%d个值:",i+1);
scanf("%d",&p->data);
p->next=NULL;
r->next=p; //新结点插入到表尾
r=p; //尾指针r指向新的尾结点
}
}
整个程序代码
#include<stdio.h>
//定义单链表结点类型
typedef struct LNode{
int data; //结点的数据域
LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
//单链表的初始化
void InitList(LinkList &L){
L=new LNode;//分配一个头结点 或L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
//判断链表是否为空
bool ListEmpty(LinkList L){
if(L->next==NULL) //判断头结点指针域是否为空
return true;
else
return false;
}
//销毁单链表
void DestroyList(LinkList &L){
LNode *p;//或LinkList p;
while(L){
p=L;
L=L->next;
delete p;
}
}
//清空单链表(只留头结点)
void ClearList(LinkList &L){
LNode *p,*q;//或LinkList p,q;
p=L->next; //p指向要删除的结点
while(p){
q=p->next; //q指向要删除的下一个结点
delete p;
p=q;
}
L->next=NULL;
}
//求表的长度(从首元结点开始算,头结点不算)
int ListLength(LinkList L){
int length=0;
LNode *p;
p=L->next;
while(p){
length++;
p=p->next;
}
return length;
}
//取值(取第i个元素)
bool GetElem(LinkList L,int i,int &e){
LNode *p; //指针p指向当前扫描到的结点
int j=1; //当前p指向的是第几个结点
p=L->next; //初始化,p指向首元结点
while(p && j<i)//向后扫描,直到p指向第i个元素或p为空
{
p=p->next;
++j;
}
if(!p || j>i) return false; //i值不合法i>n或i≤0
e=p->data;
return true;
}
// 遍历
void PrintList(LinkList L){
for(int i=0;i<ListLength(L);i++){
int e;
GetElem(L,i+1,e);
printf("第%d个元素的值=%d\n",i+1,e);
}
}
//按值查找---返回指向包含这个值的结点的指针
LNode *LocateElem(LinkList L,int e){
LNode *p=L->next;
//从第1个结点开始查找数据域为e的结点
while(p && p->data!=e)
p=p->next;
return p; //找到后返回该结点指针,否则返回NULL
}
//按值查找---返回包含这个值的结点的位置序号
int Locate(LinkList L,int e){
LNode *p=L->next;
int i=1;
while(p && p->data!=e){
p=p->next;i++;
}
if(p) return i;
else return -1; //没有找到返回-1
}
//在第i个位置插入元素e
bool ListInsert(LinkList &L,int i,int e){
LNode *p=L; //p指向头结点
int j=0;
while(p && j<i-1){ //查找第i-1个结点,p指向该结点
p=p->next;++j;
}
if(!p || j>i-1) return false; //i>n+1或i<1,插入位置不合法
LNode *s=new LNode;
s->data=e;
s->next=p->next;
p->next=s; //将新结点s连到p之后
return true; //插入成功
}
//删除第i个元素
bool ListDelete(LinkList &L,int i, int &e){
LNode *p=L;int j=0;
while(p->next && j<i-1){ //查找第i-1个结点,p指向该结点
p=p->next;++j;
}
if(!(p->next) || j>i-1) return false; //i>n或i<1,删除位置不合法
LNode *q=p->next;//令q指向被删除结点
e=q->data; //用e返回元素的值
p->next=q->next; //改变删除结点前驱结点的指针域
delete(q);
return true;
}
//头插法建立单链表(逆序排序)
void CreateList_H(LinkList &L,int n){
L=new LNode; //新建头结点
L->next=NULL;
for(int i=0;i<n;++i){
LNode *p=new LNode;
printf("请输入第%d个值:",i+1);
scanf("%d",&p->data);
p->next=L->next; //插入到表头
L->next=p;
}
}
//尾插法建立单链表(顺序排序)
void CreateList_R(LinkList &L,int n){
L=new LNode;//新建头结点
L->next=NULL;
LNode *r=L; //尾指针:最开始指向头结点,然后慢慢向后移
for(int i=0;i<n;++i){
LNode *p=new LNode;
printf("请输入第%d个值:",i+1);
scanf("%d",&p->data);
p->next=NULL;
r->next=p; //新结点插入到表尾
r=p; //尾指针r指向新的尾结点
}
}
int main(){
LinkList L;
//初始化
InitList(L);
//尾插法建立单链表
CreateList_R(L,5); //插入5个元素
printf("*******************\n");
//求表长
printf("表的长度=%d\n",ListLength(L));
//遍历
PrintList(L);
printf("*******************\n");
//查找
printf("值为4的结点位置序号=%d\n", Locate(L,4));
printf("验证:值为4的结点的数据域=%d\n", LocateElem(L,4)->data);
printf("*******************\n");
//取值(取第i个元素)
int e;
GetElem(L,2,e);
printf("第2个元素的值=%d\n",e);
printf("*******************\n");
//在第i个位置插入元素e
ListInsert(L,6,6);
printf("表的长度=%d\n",ListLength(L));
PrintList(L);
printf("*******************\n");
//删除第4个元素
int k;
ListDelete(L,4,k);
printf("表的长度=%d\n",ListLength(L));
printf("被删除的第4个元素的值=%d\n",k);
PrintList(L);
}
