//单链表 带头结点
#include <iostream>
#include <cstdio>
typedef struct LNode{ //定义单链表结点类型
int data; //每个节点存储一个数据元素
int length;
struct LNode *next; //指针指向下一个结点 结点类型的指针
}LNode,*LinkList;
//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
int x;
L = new LNode;
LNode *s; //新结点的指针
LNode *r = L; //始终指向表尾元素
scanf("%d",&x);
while(x!=9999){
s = new LNode;
s->data = x;
r->next = s;
r=s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
//头插法建立单链表
LinkList List_HeadInsert(LinkList &L){
LNode *s;
int x;
L = new LNode;
L->next = NULL;
scanf("%d",&x);
while(x!=9999){
s = new LNode;
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
//初始化一个单链表 带头结点
bool InitList(LinkList &L){
L = new LNode; //生成新结点作为头结点
if(L==NULL) return false; //内存不足分配失败
L->next = NULL;
L->length = 0;
return true;
}
//销毁操作
bool DestroyList(LinkList &L){
if(L==NULL){
return false;
}
LNode *tmp;
while(L!=NULL){
tmp = L->next;
delete L;
L = tmp;
}
L = NULL;
printf("该单链表已经销毁\n");
}
//按位查找
LNode * GetElem(LinkList L,int i){
if(i<0) return NULL;
LNode *p;
int j=0;
p = L;
while(p!=NULL&&j<i){
p = p->next;
j++;
}
return p;
}
//按值查找
LNode * LocateElem(LinkList L,int e){
LNode *p = L->next;
while(p!=NULL&&p->data!=e){
p = p->next;
}
return p;
}
//前插操作
bool InsertPriorNode(LNode *p,int e){
if(p==NULL){
return false;
}
LNode *s = new LNode;
if(s==NULL){
return false;
}
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
//后插操作
bool InsertNextNode(LNode *p,int e){
if(p==NULL){
return false;
}
LNode *s = new LNode;
if(s==NULL){
return false;
}
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//在第i个位置插入元素e
bool ListInsert(LinkList &L,int i,int e){
// if(i<1||i>L->length+1){
// return false;
// }
// LNode *p;
// int j = 0;
// p = L;
// while(p!=NULL&&j<i-1){
// p = p->next;
// j++;
// }
LNode *p = GetElem(L,i-1);
L->length++;
return InsertNextNode(p,e);
}
//删除指定结点
bool DeleteNode(LNode *p){
if(p==NULL){
return false;
}
LNode *q = p->next;
p->data = q->data;
p->next = q->next;
delete q;
//这个操作没有将结点的长度-1
return true;
}
//按位序删除
bool ListDelete(LinkList &L,int i,int &e){
// if(i<1||i>L->length){
// return false;
// }
// LNode *p;
// int j=0;
// p=L;
// while(p!=NULL&&j<i-1){
// p = p->next;
// j++;
// }
LNode *p = GetElem(L,i-1);
if(p==NULL){
return false;
}
if(p->next==NULL){
return false;
}
LNode *q=p->next;
e = q->data;
p->next = q->next;
delete q;
L->length--;
printf("已删除位序为%d的元素,其值为%d\n",i,e);
return true;
}
//输出列表
void PrintList(LinkList L){
LNode *p;
p = L->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//输出长度
void Length(LinkList L){
printf("法一:该链表的长度为%d\n",L->length);
}
//求表的长度
int Length2(LinkList L){
int len=0;
LNode *p = L;
while(p->next!=NULL){
p = p->next;
len++;
}
printf("法二:该链表的长度为%d\n",len);
return len;
}
//判空操作
bool Empty(LinkList L){
return (L->next==NULL);
}
int main(){
int e;
LinkList L;
InitList(L);
if(Empty(L)){
printf("该表是空的!\n");
}
ListInsert(L,1,3);
ListInsert(L,1,3);
ListInsert(L,2,4);
PrintList(L);
ListDelete(L,1,e);
PrintList(L);
Length2(L);
Length(L);
DestroyList(L);
LinkList L1;
List_TailInsert(L1);
PrintList(L1);
Length2(L1);
LinkList L2;
List_HeadInsert(L2);
PrintList(L2);
Length2(L2);
return 0;
}
单链表(C++)
于 2023-11-14 20:35:55 首次发布