`
isiqi
  • 浏览: 16031089 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

一步一步学链表

 
阅读更多

首先是基本框架

1. 录入链表
2. 插入一个元素
3. 删除一个元素
4. 遍历链表,输出所有
5. 链表排序
6. 退出
看了一下资料,了解了不少,写了基本框架,今天先把录入和输出给实现了吧!

先把代码贴出来:

首先是主函数:

#include <stdio.h>
#include <stdlib.h>
#define NULL 0
typedef struct Node{
	int Data;
	Node *next;
}Node;
int main()
{
	int where,select,back;
	Node *L;
	while(1)
	{
		system("color 1c");
		system("cls");
		back=0;
		select=front();       //主屏函数
		switch(select)
		{
		case 1:L=Build();break;       //创建链表
		case 2:printf("开发中……\n");break;
		case 3:printf("开发中……\n");break;
		case 4:Show(L);break;                     //遍历链表
		case 5:back=1;break;
		}
		if(back) break;
	}
	return 0;
}


然后是主屏函数函数:

int front()                 //显示主屏
{
	int opt;
	printf("***************************************\n");
	printf("	1.录入一个新链表\n");
	printf("	2.插入一个元素\n");
	printf("	3.删除一个元素\n");
	printf("	4.显示当前链表内元素\n");
	printf("	5.退出\n");
	printf("***************************************\n");
	printf("请选择:[ ]\b\b");
	scanf("%d",&opt);
	return opt;
}


其次是创建链表函数:

1.头插法:

Node *Build()               //创建链表函数
{
	system("cls");
	int n;
	printf("请输入链表结点个数:[  ]\b\b\b");
	scanf("%d",&n);
	Node *M, *N, *L;
	L=( Node*)malloc(sizeof(Node));       //开辟内存
	M=( Node*)malloc(sizeof(Node));
	printf("请输入%d个数字,以空格隔开:\n",n);
	scanf("%d",&M->Data);
	M->next=NULL;
	L->next=M;
	for(int i=1;i<n;i++)
	{
		N=( Node*)malloc(sizeof(Node));
		scanf("%d",&N->Data);
		N->next=NULL;
		M->next=N;
		M=N;
	}
	return L;
}

2.尾插法

Node *Build()               //创建链表函数
{
	system("cls");
	int n;
	printf("请输入链表结点个数:[  ]\b\b\b");
	scanf("%d",&n);
	Node *N, *L;
	L=( Node*)malloc(sizeof(Node));
	printf("请输入%d个数字,以空格隔开:\n",n);
	L->next=NULL;
	for(int i=1;i<=n;i++)
	{
		N=( Node*)malloc(sizeof(Node));
		scanf("%d",&N->Data);
		N->next=L->next;
		L->next=N;
	}
	return L;
}


然后是遍历函数:

void Show(Node *L)    //遍历函数
{
	printf("当前链表为:\n");
	int a=0;
	L=L->next;
	while(L)
	{
		a++;
		printf("%d:%d\n",a,L->Data);
		L=L->next;
	}
	system("PAUSE");
}

好吧,先写到这里,一会再把后面的部分写出来。写一下博客,思路清晰多了,嘿;嘿……大笑


插入函数:

void Inset(Node* L)     //在链表中一个插入元素
{
	system("cls");
	Node *M;
	int a;
	printf("请确定你要插入的结点位置:");
	scanf("%d",&a);
	for(int i=1;i<a;i++)
		L=L->next;
	M=( Node*)malloc(sizeof(Node));
	printf("请输入你要插入的元素:");
	scanf("%d",&M->Data);
	M->next=L->next;
	L->next=M;
}


删除函数:

void Delete(Node* L)     //删除函数
{
	Node* M;
	M=( Node*)malloc(sizeof(Node));
	int n,temp=1;
	printf("请确定你要删除的元素:");
	scanf("%d",&n);
	L=L->next;
	while(L)
	{
		if(L->Data==n)
		{
			M->next=L->next;
			temp=0;
			printf("删除成功!\a\n");
			break;
		}
		M=L;
		L=L->next;
	}
	if(temp) printf("元素不存在!!\a\n");
	system("PAUSE");
}


退出函数:

int Exit(Node* L)        //退出函数
{
	int n;
	Node* M;
	printf("是否退出?1.是/2.否[ ]\b\b");
	scanf("%d",&n);
	if(n==2) return 0;
	L=L->next;
	while(L)
	{
		M=L;
		L=L->next;
		free(M);        //释放内存
	}
	return 1;
}



呜~~~~~~终于搞定了,不过那个排序的算法没有写,太麻烦了,以后如果真用的话,就用结构体,爽呆了!!

现在把我的整体结果给贴出来吧,哈哈!得意

这是头插法的:

#include <stdio.h>
#include <stdlib.h>
#define NULL 0
typedef struct Node{
	int Data;
	Node *next;
}Node;
Node *Build()               //创建链表函数
{
	system("cls");
	int n;
	printf("请输入链表结点个数:[  ]\b\b\b");
	scanf("%d",&n);
	Node *M, *N, *L;
	L=( Node*)malloc(sizeof(Node));
	M=( Node*)malloc(sizeof(Node));
	printf("请输入%d个数字,以空格隔开:\n",n);
	scanf("%d",&M->Data);
	M->next=NULL;
	L->next=M;
	for(int i=1;i<n;i++)
	{
		N=( Node*)malloc(sizeof(Node));
		scanf("%d",&N->Data);
		N->next=NULL;
		M->next=N;
		M=N;
	}
	return L;
}
void Show(Node *L)    //遍历函数
{
	printf("当前链表为:\n");
	int a=0;
	L=L->next;
	while(L)
	{
		a++;
		printf("%d:%d\n",a,L->Data);
		L=L->next;
	}
	system("PAUSE");
}
void Inset(Node* L)     //在链表中一个插入元素
{
	system("cls");
	Node *M;
	int a;
	printf("请确定你要插入的结点位置:");
	scanf("%d",&a);
	for(int i=1;i<a;i++)
		L=L->next;
	M=( Node*)malloc(sizeof(Node));
	printf("请输入你要插入的元素:");
	scanf("%d",&M->Data);
	M->next=L->next;
	L->next=M;
}
void Delete(Node* L)     //删除函数
{
	Node* M;
	M=( Node*)malloc(sizeof(Node));
	int n,temp=1;
	printf("请确定你要删除的元素:");
	scanf("%d",&n);
	L=L->next;
	while(L)
	{
		if(L->Data==n)
		{
			M->next=L->next;
			temp=0;
			printf("删除成功!\a\n");
			break;
		}
		M=L;
		L=L->next;
	}
	if(temp) printf("元素不存在!!\a\n");
	system("PAUSE");
}
int Exit(Node* L)        //退出函数
{
	int n;
	Node* M;
	printf("是否退出?1.是/2.否[ ]\b\b");
	scanf("%d",&n);
	if(n==2) return 0;
	L=L->next;
	while(L)
	{
		M=L;
		L=L->next;
		free(M);        //释放内存
	}
	return 1;
}

int front()                 //显示主屏
{
	int opt;
	printf("***************************************\n");
	printf("	1.录入一个新链表\n");
	printf("	2.插入一个元素\n");
	printf("	3.删除一个元素\n");
	printf("	4.显示当前链表内元素\n");
	printf("	5.退出\n");
	printf("***************************************\n");
	printf("请选择:[ ]\b\b");
	scanf("%d",&opt);
	return opt;
}
int main()
{
	int where,select,back;
	Node *L;
	L=( Node*)malloc(sizeof(Node));
	L->next=NULL;
	while(1)
	{
		system("color 1c");
		system("cls");
		back=0;
		select=front();
		switch(select)
		{
		case 1:L=Build();break;          //建立
		case 2:Inset(L);Show(L);break;   //插入
		case 3:Delete(L);break;         //删除
		case 4:Show(L);break;           //遍历
		case 5:back=Exit(L);break;      //退出
		}
		if(back) break;
	}
	return 0;
}



运行结果:

分享到:
评论

相关推荐

    数据结构学习--线性表及其应用--链表

    本程序的主要目的在于帮助同学熟练掌握线性表的基本操作在链式存储结构上的...通过本实验, 对链表基本操作及其组合应用的演练,加深对链表存储方法及其基本操作的理解,为以后进 一步学习更复杂的数据结构打下基础。

    python单向链表的基本操作细节(小白入门)

    今天是人生第一次写博客,记录自己学习的每一步,有些写的不好望指正。 自己之前在学习链表的时候总是会被一些很基本的问题搞得头晕脑胀,我觉得,晦涩难懂这就是很多初学者对链表的第一印象,书上的概念实在是太难...

    判断链表是否为回文链表leetcode-daily-algorithm:简单算法的日常练习

    判断链表是否为回文链表 leetcode 最近,我发现自己很笨拙(╯`□′)╯(┻━┻。 所以我决定做一些练习来唤起我的智慧。 好的,开始吧~ ps:请原谅我可怜的英语 :) #目录: ##day1 这个算法是要计算一个等差数列的...

    基础数据结构和算法(C、C++、Java各一套)

    基础的数据结构和算法C、C++、Java实现,有线性表、链表、队列、二叉树、图、查找、排序等等,全是最标准的实现,可以用来学习也可以直接使用。用来学习的话,里边有每种算法一步一步实现的图片,更加清晰。

    leetcode题库-algorithm:基于Java和TypeScript的数据结构,LeetCode题解,欢迎star~

    学习算法是一个漫长的过程,没法靠突击,只能一步一步慢慢积累。 数据结构 数据结构 Java版 TypeScript版 数组 使用数组实现的队列 使用数组实现的栈 链表 使用链表实现的队列 使用链表实现的栈 循环队列 最大堆 ...

    C语言嵌入式Linux编程第6期:数据存储与指针

    本期课程为《C语言嵌入式Linux编程》第6期,从一个全新的视角:存储的角度,由浅入深,层层递进,一步一步去探讨讲解C指针。存储才是C语言的精髓,在存储面前,一切指针、链表、函数、变量都是浮云。抛开各种类型...

    js-linked-list:柔和但令人放心的Javascript单链列表介绍

    链表 目标 ... 让我们退后一步,仔细看一下数组。 他们的真实本性可能会让您惊讶! 阵列将数据存储在一个连续的计算机内存块中。 创建阵列时,计算机仅留出足够的内存。 您可以将计算机的内存想象成

    leetcode中国-Algorithm:力扣&PAT&

    通过快慢双指针,一个每次走一步,另一个每次走两布。可以确定链表的中间节点。 :backhand_index_pointing_right: 示例。 快慢指针也可用于判断链表中是否存在环,若存在环则 fast 与 slow 肯定会在若干步之后相遇,...

    校园导游系统-数据结构实习报告.doc

    2 通过课程设计,学会通过系统分析、系统设计、编程调试,写实验报告等环节,进 一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开 发中的应用 。 3 学会综合运用数据结构课程中图类型...

    IOI国家集训队论文集1999-2019

    + [块状链表](#块状链表) + [动态树](#动态树) + [左偏树](#左偏树) + [跳表](#跳表) + [SBT](#sbt) + [线段树](#线段树) + [单调队列](#单调队列) + [哈希表](#哈希表) + [Splay](#splay) * [图论](#图论...

    leetcode不会-Competitive-Programming-Resources:可以帮助您开始/练习竞争性编程的东西

    leetcode 不会竞争性编程资源 可以帮助您开始/练习竞争性编程的东西 选择语言: C++ 让生活更轻松。 它是竞争程序员最流行的语言选择,因为它通常比 Java ...下一步应该是掌握 C++ 编程。 HackerRan

    leetcode中国-my_leetcode:leetcode

    下一步 通过 或者 检查成果 没有思路的题目重点记录,进行下一阶段学习和总结 没法写出代码的,作为复习目标 其他计划 国外的教程 看情况购买,也许会继续刷题 目录 链表 20200525 20200526 20200527 20200528 ...

    基于C++、文件操作和Huffman算法实现图片压缩源码+使用说明+详细注释+sln解决方案.zip

    使用结构体存储节点,使用数组存储树的节点,使用静态二叉链表方式存储二叉树。 ```c++ struct HTNode{ int weight; int parent; int lchild; int rchild; }; typedef HTNode *HuffmanTree; ``` 3.Huffman...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    填写电子邮件地址(可以不填),去掉复选框,点击下一步 3. 步骤2/9:选择安装选项 勾选第一个,安装和配置数据库,点击下一步 4. 步骤3/8:选择系统类 勾选第一个:桌面类,点击下一步 5. 步骤4/8:配置数据库...

    c++运动会评分系统

    演示程序以人机对话的方式执行,即在计算机上显示提示信息后,由用户在键盘上输入对应的数据或命令,程序将执行相应的操作并显示下一步信息。1.2 功能需求分析(1)建立比赛数据;(2)显示各学校的成绩单; (3)...

    计算机二级公共基础知识

    在线性链表中进行插入与删除,不需要移动链表中的元素。 线性单链表中,HEAD称为头指针,HEAD=NULL(或0)称为空表。 如果是双项链表的两指针:左指针(Llink)指向前件结点,右指针(Rlink)指向后件结点。 线性...

    数据结构(C++)有关练习题

    b. 创建一个班机链表,每个节点都包含指向一个乘客链表的指针; c. 该程序要有顾客购票,查询班机起飞降落时间,班机订票情况等3个功能,并实现菜单选项 5、 用C++编写一个简单的行编辑器,每个结点保存一...

Global site tag (gtag.js) - Google Analytics