这是一个单链表的实现,单链表是一种常见的数据结构,它由一系列的节点组成,每个节点包含两个部分,一个是数据域,另一个是指向下一个节点的指针。单链表的优点是插入和删除操作比较方便,但是查找操作比较耗时。下面是这个程序的一些函数的解释:
-
InitList:初始化单链表,带头节点。头节点不存储数据,只是为了方便操作而设置的。
-
InitList2:初始化单链表,不带头节点。
-
ListInsert:按位插入元素,头节点。i表示插入的位置,c表示插入的元素值。
-
ListDelete:按位删除元素,头节点。i表示删除的位置,c表示删除的元素值。
-
GetElem:按位查找元素。i表示查找的位置。
-
LocateElem:按值查找元素。c表示查找的元素值。
-
Length:求单链表的长度。
这里需要注意的是,这个程序中的单链表是带头节点的,头节点不存储数据,只是为了方便操作而设置的。如果要实现不带头节点的单链表,需要对代码进行相应的修改。
#include <iostream>
typedef struct LNode{//定义单链表结点类型
int data;//每个结点存放一个数据元素
struct LNode *next;//指针指向下一个结点
}LNode,*LinkList;
//LinkList强调这是一个单链表
//LNode强调这是一个结点
//查找找i,插入删除找i-1
//查找要返回值(指针类型),所以定义的函数位LNode *......
//初始化,带头节点
bool InitList(LinkList &L){
L=(LNode *) malloc(sizeof (LNode));
if (L==NULL){//内存不足
return false;
}
L->next=NULL;
return true;
}
//不带头节点初始化
bool InitList2(LinkList &L){
L=NULL;
};
//按位插入,头节点
bool ListInsert(LinkList &L,int i,int c){
if(i<1){
return false;
}
LNode *p;//p 指向当前扫描到的结点
int j=0;//位数 当前指向第几个结点
p=L;//L指向头节点(不存数据),从头扫尾
while (p!=NULL && j<i-1){
p=p->next;
j++;
}
LNode *s=(LNode*) malloc(sizeof(LNode));
s->data=c;
s->next=p->next;
p->next=s;
return true;
}
//按位删除,头节点
bool ListDelete(LinkList &L,int i,int &c){
if(i<1){
return false;
}
LNode *p;
int j=0;
p=L;
while (p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL){//i值不合法
return false;
}
if(p->next==NULL){//到头了,后面没有元素了
return false;
}
LNode *q=p->next;//令q结点指向删除结点
c=q->data;//返回删除的元素值
p->next=q->next;
free(q);
}
//按位查找
LNode *GetElem(LinkList L,int i){
if(i<0){
return NULL;
}
LNode *p;//p 指向当前扫描到的结点
int j=0;//位数 当前指向第几个结点
p=L;//L指向头节点(不存数据),从头扫尾
while (p!=NULL&&j<i){//找到第i个结点
p=p->next;
p++;
}
return p;
}
//按值查找
LNode * LocateElem(LinkList L,int c){
LNode *p=L->next;//L为头节点第0位不存数据,这里从第一个结点开始查找数据域为c的结点
while (p!=NULL&&p->data!=c){
p=p->next;
}
return p;
}
//求表长
int Length(LinkList L){
int len=0;//统计表长
LNode *p=L;//从头开始
while (p->next!=NULL){
len++;
}
return len;
}
int main() {
LinkList L;//声明一个指向单链表的指针
InitList(L);
InitList2(L);
int c=-1;//设置初始值用来接受返回值
ListDelete(L,4,c);
GetElem(L,5);
LocateElem(L,4);
Length(L);
return 0;
}