以下注释部分均为个人经验,与各位分享,有错误请批评指正
不带头节点的情况(该部分只提关键的,完全部分请看带头节点的):
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//.是直接使用结构体名的时候才可以使用
//->是使用*结构体名(也就是给这个结构体赋予了节点的能力)的时候才可以使用
//&要对表进行更改,&必须要到位,之前出现没有&也能使用的情况纯属bug
// 单链表
//定义
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*LinkList;
//不带头节点的函数
bool InitList(LinkList &L){
L=NULL;
return true;
}
//判断列表是否为空
bool Empty(LinkList L){
if (L==NULL)
return true;
else
return false;
}
//指定节点后插插入
bool InserNextNode(LNode *p,Elemtype e){
if(p==NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));//此处经过实验,可以将LNode全部变成LinkList
if (s==NULL)
return false;
s->next = p->next;
s->data = e;
p->next = s;
return true;
}
//按位序插入
bool ListInser(LinkList &L,int i,Elemtype e){
if(i<1)
return false;
if(i==1){
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
L = s;
return true;
}
LNode *p;
int j=0;
p = L;
while (p!=NULL && j<i-1) {
p = p->next;
j++;
}
return InserNextNode(p, e);
}
int main(){
LinkList L;
InitList(L);
ListInser(L, 1, 1);
ListInser(L, 2, 2);
ListInser(L, 3, 3);
ListInser(L, 4, 4);
printf("%d\n",Empty(L));
}
带头节点的情况:(部分验证还未完成,大家可以尽情尝试)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//.是直接使用结构体名的时候才可以使用
//->是使用*结构体名(也就是给这个结构体赋予了节点的能力)的时候才可以使用
//&要对表进行更改,&必须要到位,之前出现没有&也能使用的情况纯属bug
// 单链表
//定义
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*LinkList;
bool InitList(LinkList &L);//带头节点的初始化
LNode *GetElem(LinkList L,int i);//按位置查找
bool Empty(LinkList L);//判断列表是否为空
bool InserNextNode(LNode *p,Elemtype e);//指定节点后插插入(该部分在有无头节点的情况下都可以存在)
bool ListInser(LinkList &L,int i,Elemtype e);//按位序插入
bool InsertPriorNode(LinkList p,Elemtype e);//指定节点的前插操作
bool ListDelete(LinkList &L,int i,Elemtype &e);//按位序删除
bool DeleteNode(LNode *p);//删除指定的节点(无返回已经删除的值)
LNode *LocateElem(LinkList L,Elemtype e);//按值查找指定节点
int ListlLength(LinkList L);//求表的长度
//带头节点的函数
//带头节点的的初始化
bool InitList(LinkList &L){
L=(LNode*)malloc(sizeof(LNode));
if (L==NULL)
return false;
L->next=NULL;
return true;
}
//按位置查找
LNode *GetElem(LinkList L,int i){
if(i<0){
printf("出错了\n");
return NULL;
}
LNode *p;
int j=0;
p=L;
while (p!=NULL && j<i) {
p = p->next;
j++;
}
// printf("1\n");
// printf("%d\n",p);
return p;
}
//判断列表是否为空
bool Empty(LinkList L){
if (L->next==NULL)
return true;
else
return false;
}
//指定节点后插插入(该部分在有无头节点的情况下都可以存在)
bool InserNextNode(LNode *p,Elemtype e){
if(p==NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));//此处经过实验,可以将LNode全部变成LinkList
if (s==NULL)
return false;
s->next = p->next;
s->data = e;
p->next = s;
return true;
}
//按位序插入
bool ListInser(LinkList &L,int i,Elemtype e){
if(i<1)
return false;
LNode *p;
// int j=0;
// p = L;
// while (p!=NULL && j<i-1) {
// p = p->next;
// j++;
// }
p = GetElem(L,i-1);
// printf("%d\n",p);
return InserNextNode(p, e);
}
//指定节点的前插操作
bool InsertPriorNode(LinkList p,Elemtype e){
if (p==NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
if (s==NULL)
return false;
s->data = p->data;
s->next = p->next;
p->data = e;
p->next = s;
return true;
}
//按位序删除
bool ListDelete(LinkList &L,int i,Elemtype &e){
if(i<1)
return false;
LNode *p;
// p=L;
// int j=0;
// while (p!=NULL && j<i-1) {
// p = p->next;
// j++;
// }
p = GetElem(L, i-1);
if(p==NULL)
return false;
if(p->next==NULL)
return false;
LNode *q = (LNode*)malloc(sizeof(LNode));
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return true;
}
//删除指定的节点(无返回已经删除的值)
bool DeleteNode(LNode *p){
if (p==NULL)
return false;
LNode *q = (LNode*)malloc(sizeof(LNode));
q=p->next;
p->data = q->data;//课本可能是为了更好的理解,所以我将p->next->data改成q->data
p->next = q->next;
free(q);
return true;
}
//按值查找指定节点
LNode *LocateElem(LinkList L,Elemtype e){
LNode *p = L->next;//没有头节点的请注意
while (p!=NULL && p->data!=e) {
p=p->next;
}
return p;
}
//求表的长度
int ListlLength(LinkList L){
int len=0;
LNode *p =L;
while (p->next!=NULL){
p=p->next;
printf("值为:%d\n",p->data);
len++;
}
return len;
}
//查看表内所有值
int main(){
LinkList L;
LNode *p;
InitList(L);
printf("%d\n", ListInser(L, 1, 1));
ListInser(L, 2, 2);
ListInser(L, 3, 3);
ListInser(L, 4, 4);
printf("%d\n",Empty(L));
printf("%d\n",ListlLength(L));
//验证前插操作
p=LocateElem(L, 2);
InsertPriorNode(p, 10);
printf("表的长度为%d\n",ListlLength(L));
//验证删除
Elemtype e;
ListDelete(L, 2, e);
printf("表的长度为%d\n",ListlLength(L));
//验证按值获取节点,按值删除节点
}