后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e)
{
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)//内存分配失败
return false;
s->data=e;//用节点s保存数据元素e
s->next=p->next;
p->next=s;//将节点s连接到p之后
return true;
}
//在第i个位置插入元素e(带头节点)
bool ListInsert(LinkList &L,int i,ElemType e)
{
if(i<1)
return false;
LNode *p;//指针p指向当前扫到的节点
int j=0;//当前p指针指向的是第几个节点
p=L;//L指向头节点,头节点是第0个节点(不存数据)
whlie (p!=NULL && j<i-1)//循环找到第i-1个节点
{
p=p->next;
j++;
}
if(p==NULL)//i值不合法
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;//将节点s连接到p之后
return true;
}
//前插操作:在p节点前插入元素e
bool InsertPriorNode(LNode *p,ElemTypr e)
{
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)//内存分配失败
return false;
s->next=p->next;
p->next=s;//新节点s连到p之后
s->data=p->data;//将p中元素复制到s中
p->data=e;//p中元素覆盖为e
return true;
}
按位序删除
bool ListDelete(LinkList &L,int i,ElemType &e)
{
if(i<1)
return false;
LNode *p;//指针p指向当前扫描到的节点
int j=0;//当前 p指针指向的是第几个节点
p=L;//L指向头节点,头节点是第0个节点(不存数据)
whlie (p!=NULL && j<i-1)//循环找到第i-1个节点
{
p=p->next;
j++;
}
if(p==NULL)//i值不合法
return false;
if(p->next==NULL)//第i-1个节点后已无其他节点
return false;
LNode *q=p->next;//令q指向被删除节点
e=q->data;//用e返回元素的值
p->next=q->next;//将*q节点从链中断开
free(q);//释放节点的储存空间
return true;
}
//删除指定节点
bool DeleteNode(LNode *p)
{
if(p==NULL)
return false;
LNode *q=p->next;//令q指向*p的后继节点
p->data=p->next->data;//和后继节点交换数据域
p->next=q->next;//将*q节点从链中断开
free(q);//释放后继节点的储存空间
return true;
}
//按位查找,返回第i个元素(带头节点)
LNode * GetElem(LinkList L,int i)
{
if(i<0)
return NULL;
LNode *p;//指针p指向当前扫描到的节点
int j=0;//当前p指向的是第几个节点
p=L;
whlie(P!=NULL && j<i)
{
p=p->next;
j++
}
return p;
}
//按值查找,找到数据域==e的节点
LNode * LocateElem(LinkList L,ElemType e)
{
Lnode *p=L->next;
while(p!=NULL&&p->data!=e)//从第一个节点开始查找数据域为e的节点
p=p->next;
return p;//找到后返回该结点指针,否则返回NULL
}
//求表的长度
int Length(LinkList L)
{
int len=0;//统计表长
Lnode *p=L;
while(p->next!=NULL)
p=p->next;
len++;
}
//尾插法
LinkList List_TailInsert(LinkList &L)//正向建立单链表
{
int x;
L=(LinkList)malloc(sizeof(LNode));//建立头节点
LNode *s,*r=L;//r为表尾指针
printf("请输入要建立的单链表的节点的值(正序)\n") ;
printf("输入9999即可结束");
scanf("%d",&x);//输入节点的值
while(x!=9999)//输入9999表示结束
{
s=(LNode *)malloc(sizeof(LNode));//在r节点之后插入元素x
s->data=x;
r->next=s;
r=s;//r指向新的表尾节点
scanf("%d",&x);
}
r->next=NULL;//尾节点指针置空
return L;
}
//头插法
LinList List_HeadInsert(LinkList &L)//逆向建立单链表
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));//创建头节点
L->next=NULL;//初始为空链表
scanf("%d",&x);//输入节点的值
whlie(x!=9999)//输入9999表示结束
{
s=(LNode *)malloc(sizeof(LNode));//创建新节点
s->data=x;
s->next=L->next;
L->next=s;//将新节点插入表中,L为头指针
scanf("%d",&x);
}
return L;
}
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#define ElemType int
typedef struct LNode{//定义单链表节点类型
ElemType data;//每个节点存放一个数据元素
struct LNode *next;//指针指向下一个节点
}Lnode,*LinkList;
//初始化一个单链表(带头节点)
bool InitList(LinkList &L)
{
L=(LNode *)malloc(sizeof(LNode));//分配一个头节点
if(L==NULL)//内存不足分配失败
return false;
L->next=NULL;//头节点之后暂时还没有节点
return true;
}
LinkList List_TailInsert(LinkList &L)//正向建立单链表
{
int x;
L=(LinkList)malloc(sizeof(LNode));//建立头节点
LNode *s,*r=L;//r为表尾指针
printf("请输入要建立的单链表的节点的值(正序)\n") ;
printf("输入9999即可结束");
scanf("%d",&x);//输入节点的值
while(x!=9999)//输入9999表示结束
{
s=(LNode *)malloc(sizeof(LNode));//在r节点之后插入元素x
s->data=x;
r->next=s;
r=s;//r指向新的表尾节点
scanf("%d",&x);
}
r->next=NULL;//尾节点指针置空
return L;
}
int main(){
LinkList L;//声明一个指向单链表的指针
InitList(L);//初始化一个空表
List_TailInsert(L);
}
单链表的插入和删除操作
于 2024-02-11 14:36:44 首次发布