先给大家介绍一下功能目录,因为各功能名字比较长所以列举在开头:
(当然也是为了规范起名)
InitList(&L):初始化线性表,构造一个空的线性表;
DestoryList(&L):销毁线性表,释放为线性表L分配的内存空间;
ListEmpty(L):判断线性表是否为空表并返回真假;
ListLength(L):求出线性表长度,返回L中元素个数;
DispList(L):输出线性表,当线性表L不为空的时候顺序输出L中个元素的值;
GetElem(L):按照序号求线性表中元素,用e返回L中第i个元素的值;
LocateElem(L,e):按照元素值查找,返回L中第一个值为e的序号;
ListInsert(&L,i,e):插入元素,在L的第i个位置插入一个新元素e;
ListDelete(&L,i,&e):删除元素,删除L的第i个元素,并用e返回;
完整代码如下,代码中掺杂有注释:
接下来就是SHOW TIME:
#include<iostream>
using namespace std;
typedef int ElemType;
//定义类型;
struct LinkNode{
ElemType data;
LinkNode *next;
};//创造节点,前期准备工作;定义了一个数据成员data和一个向下的指针;
//创建一个单链表//头插法
void CreatListF(LinkNode *&L,ElemType a[],int n)
{
LinkNode *s;//声明了一个名为 s 的指向 LinkNode 结构体的指针。也就是说,变量 s 可以指向一个链表节点
L=new LinkNode;//创建一个指向链表头结点的新结点L;
L->next=NULL;
for(int i=0;i<n;i++){
s=(LinkNode *)malloc(sizeof(LinkNode));//声明一个新结点且前文强调了指向LinkNode;
//并且可以将这个替换为s=new LinkNode;
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
//初始化链表
void InitList(LinkNode *&L){
L=new LinkNode;
L->next=NULL;
}
//销毁线性表;
void DestoryList(LinkNode *&L){
LinkNode *pre=L,*p=L->next;
while(p!=NULL){
free(pre);
pre=p;
p=pre->next;
}
free(pre);//free 函数只能用于释放通过 malloc 或 calloc 分配的堆内存,如果链表节点是使用 new 运算符进行分配的。正确的做法是使用 delete 运算符来释放节点的内存。
//释放内存
}
//判断线性表是否为空表
bool ListEmpty(LinkNode *L){
return(L->next==NULL);
}
//返回线性表长度
int ListLength(LinkNode *L){
int n=0;
LinkNode *p=L;
while(p->next!=NULL){
n++;
p=p->next;
}
return(n);
}
//输出线性表
void DispList(LinkNode *L){
LinkNode *p=L->next;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<"\n";
}
//按照序号求线性表中元素
bool GetElem(LinkNode *L,int i,ElemType &e){
int j=0;
LinkNode *p=L;
if(i<=0)return false;
while(j<i&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL){
return false;
}else{
e=p->data;
return true;
}
}
//按照元素值查找
int LocateElem(LinkNode *L,ElemType e){
int i=1;
LinkNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
i++;
}
if(p==NULL){
return(0);
}else{
return(i);
}
}
//插入元素
bool ListInsert(LinkNode *&L,int i,ElemType e){
int j=0;
LinkNode *p=L,*s;
if(i<=0)return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL){
return false;
}else{
s=new LinkNode;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
//删除数据元素;
bool ListDelete(LinkNode *&L,int i,ElemType &e)//这里的e是为了得到删除元素的值便于后续操作,当然也可以把ElemType &e删去
{
int j=0;
LinkNode *p=L,*q;
if(i<=0)return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL||p->next==NULL){
return false;
}else{
q=p->next;
e=q->data;
p->next=q->next;
if(q==NULL){
return false;
}
free(q);
return true;
}
}
int main()
{
LinkNode *list=NULL;//建立一个名为list的单链表,并使其初始化为空;
ElemType arr[]={1,5,7,96,3,54,6,65,88};
int length=sizeof(arr)/sizeof(arr[0]);
CreatListF(list,arr,length);//将arr数组里的数据插入单链表里
DispList(list);
int m=ListLength(list);
cout<<m<<"\n ";
cout<<ListEmpty(list)<<"\n";
ElemType e;
cout<<GetElem(list,100,e)<<"\n";
cout<<LocateElem(list,54)<<"\n";
ListInsert(list,5,77);
DispList(list);
ListDelete(list,3,e);
DispList(list);
DestoryList(list);
return 0;
}
复制即可用,希望能够帮助学习代码编程的你!