【创】数据结构与算法——链表byC语言【MOOC】
2023-09-11 14:16:58 时间
数据结构与算法——链表
1、定义
#include <stdio.h>
typedef struct Node{
Elem Type date;
struct Node *next;
}LNode,*LinkList;
2、储存——头插法
//储存——头插法:
LinkList CreateFromHead(){
LinkList L;
LNode *s;
int x;
int flag = 1;
L = (Linklist)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d",&x);
while(x!=-1){
s = (LNode*)malloc(sizeof(LNode));
s -> data = x;
s -> next = L -> next;
L -> next = s;
scanf("%d",&x);
}
return L;
}
3、储存——尾插法:
LinkList CreateFromTail(){
LinkList L;
LNode *r,*s;
int x;
L = (LNode*)malloc(sizeof(LNode));
L -> next = NULL;
r = H;
scanf("%d",&x);
while(x!=-1){
s = (LNode*)malloc((sizeof(LNode));
s -> data = x;
s -> next = r -> next;
r -> next = s;
r = s;
scanf("%d",&x);
}
r -> next = NULL;
return L;
}
4、插入
//插入结点
//要在头结点的单链表L中第i个数据元素之前插入一个数据元素e,需要在单链表中找到第i-1个结点并由指针pre指示,然后申请一个新的结点由指针s指示,其数据与的值为e,并修改第i-1个结点的指针使其指向s,使s的指针指向第i个结点
void INsList(LinkList L,int i,ElemType e){
LNode *pre ,*s;
int k = 0;
pre = L;
while(pre!=NULL&&k<i-1){
pre = pre -> next;
k++;
}
if(k!=i-1){
printf("插入错误!!!");
return ;
}
s = (Node*)malloc(sizeof(Node));
s -> data = e;
s -> next = pre -> next;
pre -> next = s;
}
5、删除
//单链表删除
//欲在带头结点的单链表L中删除第1个结点,则首先要通过计数方式找到第1-1个结点并使pre指向第1-1个结点,而后删除第1个结点并释放结点空间。
void DelList(LinkList L,int i,ElemType *e){
LNode *pre,*r;
pre = L;
int k = 0
while(pre -> next != NULL && k<i-1){
pre = pre -> next;
k++;
}
if(k != i-1){
printf("删除错误!!!");
return ERROR;
}
r = pre -> next;
pre -> next = pre -> next -> next;
free(r);
return OK;
}
Q:Question
Q1、在单链表L中,做插入运算InsList(L,i,e)时,为什么一定要先找插入位置i的直接前驱元素的地址pre,直接找到第i个位置元素的地址不可以吗?
A:不可以,因为单链表中每个结点会存储直接后继元素的地址,不存储直接前驱元素的地址。因此做插入运算InsList(L,i,e)时,不找插入位置i的直接前驱元素的地址pre会丢失前面结点的信息,使链断开。
Q2、对于单链表而言,头指针和头结点哪一个是必须的?
A:头指针
Q3、在单链表中,有无显式表示出单链表的长度?在单链表中如何得到表长度?
A:没有显式表示出单链表的长度,需要从头到尾遍历单链表得到表长度。
Q4、单链表中,已知结点p,那么从结点p出发是否可以找到其直接前驱结点?
A:不可以,因为单链表只能按从头到尾的顺序访问,不能逆序访问前驱结点
Q5、带头结点的单链表和不带头结点的单链表有何区别?
A:带头节点的单链表,在进行插入和删除操作时,无论删除和插入的位置如何,不需要修改head的值,不带头结点的单链表则需要修改head的值。
Q6、带头结点的单链表有什么优点?
A:带头结点的单链表在进行添加删除操作时,相比于不带头结点的单链表相比,要更加方便,因为不需要对是否头结点进行专门的处理
PS:
1、单链表的头插建立算法也称为反向建立单链表。
2、单链表的插入、删除效率优于顺序表。
相关文章
- 用C语言,如何判断主机是 大端还是小端(字节序)
- C语言/C++常见习题问答集锦[八十二]之数据结构顺序表
- C语言/C++常见习题问答集锦(七十一) 之创建链表与洗牌发牌
- C语言/C++常见习题问答集锦(五十三) 之素数与指针选择排序
- C语言/C++常见习题问答集锦(三十一)
- ZZNUOJ_C语言1040:数列求和1(完整代码)
- ZZNUOJ_用C语言编写程序实现1218:反转a+b(附完整源码)
- ZZNUOJ_用C语言编写程序实现1932:a-b?(附完整源码)
- 【C语言】字符数组初始化方法
- 【华为云技术分享】#探索鲲鹏#之“在鲲鹏上使用编程语言——C语言
- C语言入门之链表
- C语言之制作ota文件包(作为参考)
- C语言之链表简单操作(亲测可用)
- C语言链表全部操作
- C语言链表简单操作
- ubuntu使用python调用C语言函数
- 数据结构_十字链表(C语言)
- C语言写元素类
- 2022C语言知识点大全【详细、必备】