单链表的基本操作的实现 C++实现
定义单链表结点类型
#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); }