《数据结构》 单链表常用操作代码集合
时间:2022-04-26
本文章向大家介绍《数据结构》 单链表常用操作代码集合,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Ps:每段代码中,添加了Solo署名的是博主自己写的,其余来自课本或老师。
//单链表存储结构
typedef struct Node //结点类型定义
{
ElemType data;
struct Node *next; //LinkList为结构体指针类型
} Node, *LinkList;
//初始化单链表
InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node)); //建立头结点
(*L)->next = NULL; //建立空的单链表L
}
//头插法
void CreateFromHead(LinkList L)
/*L是带头结点的空链表头指针,通过键盘输入表中元素值,利用头插法建立单链表L*/
{
Node *s;
char c;
while((c = getchar()) != '$') /*设$元素为输入结束字符*/
{
s = (Node*)malloc(sizeof(Node));
s->data = c;
s->next = L->next;
L->next = s;
}
}
//尾插法
void CreateFromTail()
/*L未初始化,无头结点,通过键盘输入表中元素值,利用尾插法建立单链表L*/
{
LinkList L;
Node *r, *s;
char c;
L = (Node *)malloc(sizeof(Node));
L->next = NULL; //以上包含L的初始化
r = L; //r指针动态指向当前表尾,以便于做尾插入,其初值指向头结点
while((c = getchar()) != '$')
{
s = (Node*)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
//在单链表中查找第i个结点
Node * Get(LinkList L, int i)
/*在带头节点的单链表L中查找第i个结点,若找到(1<=i<=n),则返回该结点的存储位置,否则返回NULL*/
{
int j;
Node *p;
if(i <= 0) return NULL;
p = L; j = 0; //从头结点开始扫描
while((p->next != NULL) && j < i)
{
p = p->next; //扫描下一结点
j++; //已扫描结点计数器
}
if(i==j) return p; //找不到,i>n
else return NULL;
}
//在单链表L中查找值为key的结点
Node * Locate(LinkList, ElemType key)
/*在带头结点的单链表L中查找其结点值等于key的第一个结点,若找到则返回该结点的位置p,否则返回NULL*/
{
Node p;
p = L->next;
while(p != NULL)
if(p->data != key) p = p->next;
else break;
return p;
}
//求单链表的长度
int ListLength(LinkList)
{
Node *p;
p = L->next;
j = 0;
while(p != NULL)
{
p = p->next;
j++;
}
return j;
}
//单链表的插入操作
#define OK 1
#define ERROR 0
void InsList(LinkList, ElemType)
/*在带头结点的单链表L中第i个位置插入值为e的新结点*/
{
Node *pre, *s;
int k;
if(i <= 0) return ERROR;
pre = L; k = 0;
while(pre != NULL && k < i-1)
{
pre = pre->next;
k++;
}
if(pre == NULL || k > i-1)
{
printf("插入位置不合理!");
return ERROR;
}
s = (Node *)malloc(sizeof(Node));
s->data = a;
s->next = pre->next;
pre->next;
pre->next = s;
return OK;
}
//单链表删除操作
int DelList(LinkList L; int i; ElemType *e)
/*在带头结点的单链表中删除第i个元素,并将删除的元素保存在*e中*/
{
Node *pre, *r;
int k;
pre = L; k = 0;
while(pre->next != NULL && k < i-1)
/*寻找被删除的结点i的前驱结点i-1使pre指向它*/
{
pre = pre->next;
k++;
}
if(pre->next == NULL || k > i-1)
/*while循环是因为p->next=NULL或i<1而跳出的,因为pre->next为空*.没有找到合法的前驱位置,说明删除位置不合法*/
{
printf("删除结点位置的i不合理");
return ERROR;
}
r = pre->next; //pre指向i-1 r指向i
pre->next = r->next; //使i-1的next指向i+1结点
*e = r->data;
free(r);
return OK;
}
//合并两个有序的单链表
LinkList MergeLinkList(LinkList LA, LinkList LB)
/*将递增有序的单链表LA和LB合并成一个递增有序的单链表LC*/
{
Node *pa, *pb;
LinkList LC;
/*将LC初始置空表。pa和pb分别指向两个单链表LA和LB中的第一个结点,r初值为LC且r始终指向LC的表尾*/
pa = LA->next;
pb = LB->next;
LC = LA;
LC->next = NULL; r = LC;
/*当两个表中均为处理完时,比较选择将较小值存入新表LC中*/
while(pa != NULL && pb != NULL)
{
if(pa->data <= pb->data)
{r->next = pa; r = pa; pa = pa->next;}
else {r-next = pb; r = pb; pb = pb->next}
if(pa) r->next = pa;
else r->next = pb;
}
free(LB);
return(LC);
}
/*删除有序单链表中值重复的结点——Solo*/
int Delsame(LinkList L)
{
Node *pre,*p,*r;
pre = L->next;
p = pre->next;
while(p->next != NULL)
{
if(p->data = pre->data)
{r=p; p=p->next; pre->next = p; free(r)}
else
{pre = p; p = p->next; }
}
return OK;
}
zhihu:Solo | weibo@从流域到海域
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决VScode配置远程调试Linux程序的问题
- Android EasyBarrage实现轻量级弹幕效果
- android 获取本机其他app的版本信息的示例代码
- android相册选择图片的编码实现代码
- ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
- Android图片三级缓存的原理及其实现
- Android TextView实现带链接文字事件监听的三种常用方式示例
- Android ViewDragHelper使用介绍
- Android语音声波控件 Android条形波控件
- Ubuntu下安装CUDA10.0以及问题
- Android ListView实现单选及多选等功能示例
- Recyclerview添加头布局和尾布局、item点击事件详解
- Android 中LayoutInflater.inflate()方法的介绍
- Android ListView实现简单列表功能
- Ubuntu16.04上安装CUDA9.0 详细教程