数据结构核心代码 day2

本文详细介绍了单链表的基本操作,包括头插法、尾插法建立链表,按序号和按值查找节点,以及在特定位置插入和删除节点的算法实现。这些操作是链表数据结构中的核心内容,对于理解和掌握链表至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注: 第二章是基础,很重要,从课后习题也可以看出顺序表和链表的重要性,主要是掌握有哪些类型的题目,先理解看懂,再反复练,最后能快速默写出来。

2.2 单链表
单链表节点定义
typedef struct LNode{ //定义单链表结点类型
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;

单链表基本操作
头插法
LinkList CreateList1(LinkList &L){
//从表尾到表头逆向建立单链表L,每次均在头结点之后插入元素
LNode s;int x;
L=(LinkList)malloc(sizeof(LNode)); //创建头结点
L->next=NULL; //初始化为空链表
while(scanf(“%d”,&x) != EOF){ //循环输入
s=(LNode
)malloc(sizeof(LNode));//创建新结点
s->data=x;
s->next=L->next;
L->next=s; //将新结点插入表中,L为头指针
scanf(“%d”,&x);
}//while结束
return L;
}
尾插法
LinkList CreatList2(LinkList &L) {
//从表头到表尾正向建立单链表L,每次均在表尾插入元素
int x; //设元素类型为整型
L = (LinkList)malloc(sizeof(LNode));
LNode *s, r = L; //r为表尾指针
while(scanf(“%d”,&x) != EOF) { //循环输入
s = (LNode
)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; //r指向新的表尾结点
scanf(“%d”,&x);
}
r->next = NULL; //尾结点指针置空
return L;
}

按序号查找
LNode *GetElem(LinkList L,int i){
//本算法取出单链表L(带头结点)中第i个位置的结点指针
int j=1; //计数,初始化为1
LNode *p=L->next; //头结点指针赋给P
if(i==0)
return L; //若i等于0.则返回头结点
if(i<1)
return NULL; //若i无效,则返回NULL
while(p&&j<i){ //从第1个结点开始找,查找第i个结点
p=p->next;
j++;
}
return p; //返回第i个结点的指针,如果i大于表长,p=NULL,直接返回p即可
}

按值查找
LNode *LocateElem(LinkList L,ElemType e){
//本算法查找单链表L(带头结点)中数据域值等于e的结点指针,否则返回NULL
LNode *p=L->next;
while(p!=NULL&&p->data!=e)//从第1个结点开始查找data域为e的结点
p=p->next;
return p; //找到后返回该结点指针,否则返回NULL
}

插入节点操作 (两种)
前插
p=GetElem(L,i-1); //查找插入位置的前驱结点
s->next=p->next; //图2.7中操作步骤1
p->next=s; //图2.7中操作步骤2
后插
//将s结点插入到p之前的主要代码片段
s->next=p->next; //修改指针域,不能颠倒
p->next=s;
temp=p->data; //交换数据域部分
p->data=s->data;
s->data=temp;

删除节点操作
//删除所给节点后一节点
p=GetElem(L,i-1); //查找删除位置的前驱结点
q=p->next; //令q指向被删除结点
p->next=q->next; //将*q结点从链中“断开”
free(q); //释放结点的存储空间

//删除所给节点
q=p->next; //令q指向p的后继结点
p->data=p->next->data; //和后继结点交换数据域
p->next=q->next; //将
q结点从链中“断开”
free(q); //释放后继结点的存储空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值