单链表的操作(带头节点)

单链表的操作(带头节点)

typedef struct LNode{//声明一个结构体
 int data;
 struct LNode* next;
}LNode,*LinkList;
链表的各种具体操作函数
bool InitList(LinkList& L)//链表的初始化
bool Empty(LinkList& L)//判断链表是否为空
int Length(LinkList& L)//求单链表的长度
bool ListInsert(LinkList& L, int i, int e) {//在链表的第i个位置上插入元素e;i指的是不包括头节点;
bool InsertNextNode(LNode* p, int e) {//在p节点之后插入元素e;
bool InsertPriorNode(LinkList L,LNode* p,int e) {//前插操作:在p节点之前插入元素e
bool ListDelete(LinkList& L, int i, int& e) {//删除表L中第i个位置的元素,并用e返回删除元素的值
bool DeleteNode(LinkList& L,LNode* p) {//删除指定节点p
LNode* GetElem(LinkList L, int i) {//按位查找,找到第i个节点
LNode* LocateElem(LinkList L, int e) {//按值查找,找到数据域位e的节点
LinkList List_TailInsert(LinkList& L) {//尾插法建立单链表
LinkList List_HeadInsert(LinkList& L) {//头插法建立单链表,既逆向建立单链表
bool InitList(LinkList& L){
 L =(LNode*)malloc(sizeof(LNode));//声明一个带头节点的头指针
 L->next = NULL;//设置头节点的next域为空;
 return true;
}

bool Empty(LinkList& L) {
 if (L->next == NULL) {
  return 1;
 }
 return 0;
}

int Length(LinkList& L) {
 int length = 0;
 LNode* p=L->next;
 while (p) {
  length++;
  p = p->next;
 }
 return length;
}

bool ListInsert(LinkList& L, int i, int e) {//在链表的第i个位置上插入元素e;i指的是不包括头节点;
 if (i < 1) {//插入的第i个位置不合法
  return 0;
 }
 LNode* s = (LNode*)malloc(sizeof(LNode));//生成一个新节点
 LNode* p = L;
 int t = 0;
 while (p != NULL && t < i - 1) {//找到第i个位置的前驱节点p
  p = p->next;
  t = t + 1;
 }
 if (p == NULL) {//表示插入的位置已经超过了聊表的最后一个位置;
  return 0;
 }
 s->data = e;
 s->next = p->next;
 p->next = s;
 return 1;//插入成功
}

bool InsertNextNode(LNode* p, int e) {//在p节点之后插入元素e;
 if (p == NULL) {
  return 0;
 }
 LNode* s = (LNode*)malloc(sizeof(LNode));//生成一个新的待插入的节点
 s->data = e;
 s->next = p->next;
 p->next = s;
 return 1;
}

bool InsertPriorNode(LinkList L,LNode* p,int e) {//前插操作:在p节点之前插入元素e
 if (p == NULL) {
  return 0;
 }
 LNode* q = L;
 while (q->next != p) {
  q = q->next;
 }
 LNode* s = (LNode*)malloc(sizeof(LNode));//生成一个新的待插入的节点
 s->data = e;
 s->next = q->next;
 q->next = s;
 return 1;
}

bool ListDelete(LinkList& L, int i, int& e) {//删除表L中第i个位置的元素,并用e返回删除元素的值
 if (i < 1) {
  return 0;
 }
 int t = 0;
 LNode* p = L;
 LNode* q = L;
 while (p != NULL && t < i - 1) {//找到被删除节点的前驱节点
  p = p->next;
  t = t + 1;
 }
 if (p == NULL) {//第i-1个节点不存在
  return 0;
 }
 if (p->next == NULL) {//不存在被删除节点******
  return 0;
 }
 q = p->next;
 e = q->data;
 p->next =q->next;
 free(q);
 return 1;
}

bool DeleteNode(LinkList& L,LNode* p) {//删除指定节点p
 if (p == NULL) {
  return 0;
 }
 LNode* q = L;
 while (q!=NULL&&q->next !=p) {
  q = q->next;
 }
 if (q == NULL) {//p节点不在该链表中
  return 0;
 }
 q->next = p->next;
 free(p);
 return 1;
}

LNode* GetElem(LinkList L, int i) {//按位查找,找到第i个节点
 if (i < 1) {
  return NULL;
 }
 int t = 0;
 LNode* p = L;
 while (p != NULL && t < i) {
  p = p->next;
 }
 return p;
}

LNode* LocateElem(LinkList L, int e) {//按值查找,找到数据域位e的节点
 LNode* p = L->next;
 while (p != NULL && p->data != e) {
  p = p->next;
 }
 return p;
}

LinkList List_TailInsert(LinkList& L) {//尾插法建立单链表
 int x;
 L= (LNode*)malloc(sizeof(LNode*));
 L->next = NULL;
 LNode* p = L;//p节点始终为最后一个节点
 scanf("%d", &x);//输入第一个节点的值
 while (x != 99) {
  LNode* s = (LNode*)malloc(sizeof(LNode*));
  s->data = x;
  s->next = p->next;
  p->next = s;
  p = p->next;
  scanf("%d", x);
 }
 return L;
}

LinkList List_HeadInsert(LinkList& L) {//头插法建立单链表,既逆向建立单链表
 int x;
 L = (LNode*)malloc(sizeof(LNode*));
 L->next = NULL;
 scanf("%d", &x);
 while (x != 99) {
  LNode*s = (LNode*)malloc(sizeof(LNode*));
  s->data = x;
  s->next = L->next;
  L->next = s;
  scanf("%d", &x);
 }
 return L;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值