小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

顺序表与链表的操作

程序、数据结构与算法,链表,数据结构 额外说明

收录于:18天前

继上一节C语言实现序列表和链表创建可以知道顺序表是借助数组实现连续空间的处理,而在链表中每个结点是同一级别的变量,通过记录地址实现连接。

线性表的抽象定义中也定义了基准测试的基本操作,如下:

  • 顺序表
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
typedef struct{
    
	int item[MAXSIZE];
	int length;
}SeqList;


//初始化
int InitList(SeqList *L){
    
	//L->item = (int*)malloc(sizeof(int)*10); 动态分配数组
	L->item[0] = {
    };   //初始化
	L->length = 0;
	return 0;
}

//插入元素
int Insert(SeqList *L,int e,int n){
    
	if(n<1 || n>L->length) {
       //插入位置大于当前删除在最后插入,输入位置无效
		L->item[n-1] = e;
		return 1;
	}
	if(L->length == MAXSIZE) return 0;
	for(int i =L->length-1;i>=0;i--){
       //从i之后的位置元素整体后移
		L->item[i+1]= L->item[i];
	}
	L->item[n-1] = e;
	L->length++;
	return 1;
}

//删除
int Delete(SeqList *L,int n){
    
	if(n<1 || n>L->length) return 0;
	for(int i = n-1;i<L->length;i++){
       //删除位置后面的元素整体前移
		L->item[i] = L->item[i+1];
	}
	L->length--;
	return 1;
}

//取值
int GetLocate(SeqList *L,int n){
    
	if(n<1 || n>MAXSIZE) return 0;
	int e = L->item[n-1];
	return e;
}

//查找
int Query(SeqList *L,int e){
    
	for(int i =0;i<L->length;i++){
    
		if(L->item[i] == e) return i+1;
	}
	return 0;
}


int main(){
    
	SeqList L;
	InitList(&L);
	Insert(&L,3,1);
	int e = GetLocate(&L,1);
	printf("%d",e);
}
  • 链表
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0

typedef struct LNode{
    
	int data;
	struct LNode *next;
}LNode,LinkList;


int main(){
    
	//生成链表
	LinkList* L = (LNode*)malloc(sizeof(LNode));
	//链表必须存在头指针
	LNode* head = L;
	printf("输入添加元素的个数:\n");
	int e,length;
	scanf("%d",&length);
	for(int i=0;i<length;i++){
    
		//创建新结点
		LNode* node = (LNode*)malloc(sizeof(LNode));
		printf("请输入:");
		scanf("%d",&e);
		node->data = e;
		node->next =NULL;
		head->next = node;
		head = node;     //头指正记录当前最后一个结点
	}	
	//打印链表
	while(L->next != NULL){
    
		L=L->next;
		printf("%d",L->data);
	}
}

在链表的创建时是在主函数中创建的,若干零散的变量通过指针联系在一起,那么要遵循模块化开发,都放在主函数是不合理的。此时就需要借助malloc函数了,该方法创建的变量存在于堆内存中,随程序的运行一直存在,就如同创建了一个全局变量。

因此,创建链表的步骤也可以模块化并在一个方法中执行。

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0

typedef struct LNode{
    
	int data;
	struct LNode *next;
}LNode,LinkList;

int InitList(LinkList *L);
int AddElem(LinkList *L,int e);
void dislapy(LinkList *L);
int CreateList(LinkList *L, int e);

int main(){
    
	
	LinkList *L;
	InitList(L);
	CreateList(L,3);
	printf("%s","fgdfdkjgfd");
	/* LinkList* L = &list; //不可省略,不能直接传递 InitList(L); AddElem(L,5); AddElem(&L,10); AddElem(&L,6); AddElem(&L,3); */
	//dislapy(L);

	return 1;
}

//new是c++的初始化方法,c预言中改为malloc(用起来复杂)
int InitList(LinkList *L){
    
	L = (LNode*)malloc(sizeof(LNode));   //分配内存空间 c++使用new关键字
	L -> data = 0;
	L -> next = NULL;
	return 1;
}

int CreateList(LinkList *L, int e){
    
	//链表必须存在头指针
	LNode* head = L;
	//创建新结点
	LNode* node = (LNode*)malloc(sizeof(LNode));
	node->data = e;
	node->next =NULL;
	head->next = node;
	head = node;     //头指正记录当前最后一个结点
	
}

//插入
int InsertElem(LinkList *L,int e){
    
	//生成一个新节点 (malloc生成为全局变量)
	LNode *node = (LNode*)malloc(sizeof(LNode));
	//值赋值个新结点
	node->data = e;
	node->next = NULL;
	//将元素放到最后(尾插法特殊形式)
	while(L->next != NULL){
    
		L = L ->next;     //头结点指向下一个结点,判断是否为尾结点 (尾结点的指向NULL)
	}
	node->next = L->next;   //新结点的后继指针域指向尾结点的后置指针域
	L->next = node;   //尾结点后继结点指向新结点
	return OK;	
}

//删除
int DeleteElem(LinkList *L,int i){
    
	int j =0;
	LNode *p = L;
	while(L->next != NULL){
    
		j++;
		p = p->next;
		if(j == i){
    
			p->next = p->next->next;
			return 1;
		}
	}
	return 0;
}

//遍历
void dislapy(LinkList* L){
    
	while(L->next != NULL){
    
		//TODO
		printf("%d",L->data);
	}
}
. . .

相关推荐

额外说明

linux 两服务器之间复制文件

将本机文件夹  /home/Iot/的文件data.jar   传到 服务172.16.239.245用户名称为root的文件夹home/Iot/data/下 # scp /home/Iot/data.jar root@172.16.239.245:/h

额外说明

Java多线程中使用notifyAll()方法的教程

简介 本文将承接《Java多线程wait()和notify()系列方法使用教程》,结合代码实例,补充讲解下notifyAll()方法的作用以及使用时需要注意的地方。 一.notifyAll()方法在JDK中的定义 notifyAll()唤醒正在等待此对象

额外说明

解决Windows更新失败(0x8007000d)的详细方法

Window更新时,一直处于“正在准备windows,请不要关闭你的计算机”,时间太长了,直接重启,再进系统发现这样子了。 此代码表示有需要更新的文件丢失或损坏 管理员方式运行cmd,输入 DISM.exe /Online /Cleanup-image

额外说明

【Python】【Selenium】如何设定文件自动下载存储

【背景】 用selenium写爬虫的一大目的往往是自动获取资源,但默认状态下webdriver在下载付件时会要求用户点击允许,然后还要手动选择保存在哪个文件夹,这样就起不到自动下载的目的了。今天来介绍如何允许webdriver自动保存,并且预设存储路径的

额外说明

Java数据库 1.5 SQLyog 图形化开发工具

SQLyog 图形化开发工具 安装 使用 安装 自行从网上下载. 使用 输入用户名, 密码, 点击链接按钮, 进行访问 MySQL 数据库进行操作. 在 Query 窗口中, 输入 SQL 代码, 选中要执行的 SQL 代码, 按 F8 键运行, 或按执

额外说明

【已解决】nvidia-smi不显示正在使用GPU的进程

目录 1 问题背景 2 问题探索 3 问题解决 4 告别Bug 1 问题背景 环境: 远程服务器Ubuntu20.04 CUDA 11.6 现象:在日志文件和终端均显示Python脚本已使用了GPU 但是nvidia-smi中的Processes进程无显

额外说明

Java字节流和字符流详解

文章目录 IO概述 什么是IO IO的分类 IO的流向说明图解 顶级父类们 字节流 一切皆为字节 字节输出流【OutputStream】 FileOutputStream类 构造方法 写出字节数据 数据追加续写 写出换行 字节输入流【InputStrea

额外说明

三、docker镜像管理

一、docker镜像管理 1.1、镜像搜索-search 从docker镜像仓库模糊搜索镜像 用法: docker search 镜像关键字 [root@zutuanxue ~]# docker search centos NAME

额外说明

Windows系统找不到msls31.dll文件导致程序异常问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个msls31.dll文件(挑

额外说明

如何控制您的WordPress管理栏

Recently we showed you how to 禁用 WordPress 管理栏 for all users except administrators. Although there are times when you will want

ads via 小工具