IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 线性表的链式存储结构初始化及查找、插入、删除(C语言) -> 正文阅读

[数据结构与算法]线性表的链式存储结构初始化及查找、插入、删除(C语言)

线性表链式表示和实现:初始化及查找、插入、删除的实现

代码

#include <stdio.h>
#include <stdlib.h>
#define ERROR NULL

typedef struct LNode *PtrToLNode;
struct LNode {
	int Data;
	PtrToLNode Next;
};
typedef PtrToLNode Position;//后面是别名
typedef PtrToLNode List;


/* 初始化线性表 */
PtrToLNode  MakeEmpty( )
{
	PtrToLNode L;
	L = (List)malloc(sizeof(LNode)); /* 产生头结点,并使L指向此头结点 */
	if (!L) /* 存储分配失败 */
		return 0;
	L->Next = NULL; /* 指针域为空 */

	return L;
}

//表的创建(头插法:将新创建的结点添加到链表的第一个数据结点之前,作为链表新的首个数据结点)
void CreateList_L1(List &L, int m[], int n){   //此处&为引用,会改变原来值
	List p;
	int i = 0;
	//逆位序输入n个元素的值,建立带表头结点的单链线性表L
	L = (List)malloc(sizeof(LNode));
    L->Next = NULL;          /*初始化定义头节点,
							 表示头节点的下一个节点为空,
							 就是该链表只有一个头节点*/

	for (i = 0; i < n; i++) {
		p = (List)malloc(sizeof(LNode));
		p->Data = m[i];  //首先将插入位置之后的链表链接到新结点p上
		//scanf("%d", &p->Data); //输入元素值	
//插入到表头
		p->Next = L->Next;  /* 修改新节点的指针域,使其指向头节点*/
		L->Next = p;   //修改头结点的指点域,使其指向新节点p
	}
}

//表的创建(尾插法:把新来的节点插入到上一个尾部,把最后一个节点的next值赋为空)
void CreateList_L2(List &L, int m[], int n) {
	List p,r; //结构体指针
	int i = 0;
	//逆位序输入n个元素的值,建立带表头结点的单链线性表L
	L = (List)malloc(sizeof(LNode));
	
	r = L;//定义一个指针,记录每次插入变换后的最后一个节点的指针域信息
	for (i = 0; i < n; i++) {
		p = (List)malloc(sizeof(LNode));
		p->Data = m[i];
		r->Next = p; //将 r(当前还是代表头节点的地址)的下一个节点指向p
		r = p;       //将原本表示头部节点地址的指针赋值为新插入的节点,表示当前节点
	
	}
	r->Next = NULL;          /*建立一个带头结点的单链表*/
}


/*求表长*/
int length(List PtrL) {
	List p = PtrL;  /*p指向表的第一个节点*/
	int j = 0;
	while (p) {
		p = p->Next; 
		j++;  /*当前p指向表的第j个节点*/
	}
	return j;
}


/* 按值查找 */
int Find(int X, List &L )
{
	List p = L->Next; /* p指向L的第1个结点 */
	while (p && p->Data != X)
		p = p->Next;
	if (p)
		return p->Data;
	else
		return ERROR;
}

/* 按序号查找 */
int Find2(int K, List &PtrL) {
	List p = PtrL;
	int i = 0;
	while (p != NULL && i < K) {
		p = p->Next;
		++i;
	}
	if (i == K) return p->Data;
	/*找到第K个,返回数据*/
	else  return NULL;
	/*否则返回NULL*/
}

/*插入*/
int Insert(List &L, int i,int e ) {
	//在含头节点的单链线性表L中第i个位置之前插入元素e
	List p = L;
	int j = 0;
	while (p&&j < i - 1) { //寻找第i-1个结点
		p = p->Next; ++j;
	}
	if (!p || j > 1 - 1) {  //i小于1或者大于表长+1   
		printf("参数i错");
        return ERROR;  
	}             
	List s = (List)malloc(sizeof(struct LNode)); /*申请、填装,生成新结点*/
	s->Data = e;       
	s->Next = p->Next; //插入L中,新结点插入在第i-1个结点的后面
	p->Next = s;

	return 0;
}

/* 删除 */
int Delete(List &L, int i)
{
	//在含有头结点的单链线性表PtrL中,删除第i个元素
	List p = L;
	int j = 0;
	while (p->Next&&j < i - 1) { //寻找第i-1个结点,并令p指向其前趋
		p = p->Next; ++j;
	}
	if (!p->Next || j > i - 1) {  //删除位置不合理  
		printf("第%d个结点不存在", i - 1);
		return ERROR;
	}

	List q = (List)malloc(sizeof(struct LNode)); /*申请、填装,生成新结点*/
	q = p->Next;       /*q指向第i个结点*/
	p->Next = q->Next;  
	free(q);	    /*删除并释放结点*/

	return 0;
}

void output(List L) {
	List p;
	p = L;
	printf("此时PtrL线性表元素为\n");
	p = L->Next;
	while (p) {
		printf("%d ", p->Data);
		p = p->Next;
	}
	printf("\n");
}

int main() {
	List PtrL;//结构体指针 
	int p1, p2;
	p1 = 0;
	p2 = 0;
	int i = 0;
	int m[100];

	for (i = 0; i < 5; i++) { 
		scanf("%d", &m[i]);
	}
    CreateList_L2(PtrL,m, 5);

	printf("PtrL->Data大小为%d位\n", sizeof(PtrL->Data) / sizeof(int));
	printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));
	output(PtrL);

	printf("第1位插入1000\n");
	Insert(PtrL,1,1000 );
	printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));
	output(PtrL);

	printf("删除第2位\n");
	Delete(PtrL,2);//删除第2位
	printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));
	output(PtrL);

	printf("查找2的位置\n");
	p1= Find(4, PtrL);
	printf("2在PtrL第%d位\n", p1);
	printf("查找第1位\n");
	p2 = Find2(1, PtrL);
	printf("第1位在PtrL为%d\n", p2);

	return 0;
}



运行

1 2 3 4 5
PtrL->Data大小为1位
PtrL->Data长度共6(包含\0)
此时PtrL线性表元素为
1 2 3 4 51位插入1000
PtrL->Data长度共7(包含\0)
此时PtrL线性表元素为
1000 1 2 3 4 5
删除第2位
PtrL->Data长度共6(包含\0)
此时PtrL线性表元素为
1000 2 3 4 5
查找2的位置
2在PtrL第4位
查找第1位
第1位在PtrL为1000

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:30:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:28:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码