28_链表插入和删除算法的演示.swf
#include<stdio.h>
#include<malloc.h>
#include <stdio.h>
#include <stdlib.h> typedef struct Node{
int data;//数据源
struct Node* pNext;//指针域
}NODE,*PNODE; // NODE等价于struct Node,PNODE等价于struct Node*;
//函数的声明
//创建一个非循环的链表
PNODE create_list(void){
int len;//存放结果的数目
int val;
//创建头结点,该头结点不存储数据
PNODE pHead = (PNODE)malloc(sizeof(NODE));
PNODE pTail = pHead; //保证PTail永远指向链表的尾结点
pTail->pNext = NULL;
if(NULL == pHead){
printf("程序内存分配失败");
exit(-);
}
printf("请输入你要创建节点的数目:");
scanf("%d",&len);
for(int i = ;i < len;i++){
printf("请输入第%d节点的值:",i+);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew){
printf("程序内存分配失败");
exit(-);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead; } /*
判断链表是否为null
*/ bool isEmpty(PNODE pHead){
if(pHead->pNext == NULL){//说明链表为空
return true;
}else{
return false;
}
} /*
获得链表的长度
*/ int length_list(PNODE pHead){
int count = ;
PNODE p = pHead->pNext; // 第一个节点不存储数据,所以要移动下一个节点
while(NULL != p){//说明该节点不为null
int val = p->data; //得到数据
p=p->pNext;//p移动到下一个节点
count=count+;
}
return count;
} /*
输出该链表的所有值
*/
void printf_list(PNODE pHead){
PNODE p = pHead->pNext; // 第一个节点不存储数据,所以要移动下一个节点
while(NULL != p){//说明该节点不为null
int val = p->data; //得到数据
printf("%d\n",val);
p=p->pNext;//p移动到下一个节点
} }
/*
对链表进行排序
仿造对数组的排序
for(int i = 0 ; i< len -1 ;i++){
for( int j = i+ 1; j< len ;j++){ } } */
//单链表的排序
void sort_list(PNODE pHead)
{
int i,j,t;
PNODE p=pHead->pNext; for(i=;i<length_list(pHead)-;i++)
{
p=pHead->pNext;
for(j=;j<length_list(pHead)-i-;j++)
{
if(p->data < p->pNext->data) //冒泡法,将最小的冒泡到最后,降序排列;
{
t=p->data;
p->data = p->pNext->data ;
p->pNext->data = t ;
}
p=p->pNext;
}
}
} /*
for(i=0;i<n-1;i++) for(j=i+1;j<n;j++)
**/
void sort_array(int*arr,int len){ int i = ;
int j = ;
int temp;
for(i = ;i< len-;i++){ //p要执行当前节点的下一个节点
for(j = i+;j<len;j++){
if(arr[i]>arr[j]) {
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
} }
void print_array(int*arr,int len){
for(int k = ; k<len;k++){
printf("a[%d]=%d\n",k,*(arr+k));
}
} /*
在链表的pos下标插入值val ,并且pos的值必须大于1
*/ void insert(PNODE pHead,int pos,int val){
int i=;
PNODE p=pHead; //不需判断链表是否为空,不需判断pos是否满足链表长度要求等。。此部分用while和if全部搞定
while(NULL!=p&&i<pos-) //不能写成<=,否则出错
{
i++;
p=p->pNext;
}
if(i>pos- || NULL==p)
return false; PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(NULL==pNew)
{
cout<<"分配失败,程序终止!"<<endl;
exit(-);
} pNew->data =val;
PNODE q=p->pNext;
p->pNext =pNew;
pNew->pNext =q; return true;
} /*
将链表的pos位置的数据删除 ,删除的数据保存到 int*val变量中
*/ bool delete_list(PNODE pHead,int pos,int *pVal)
{
int i=;
PNODE p=pHead; //不需判断链表是否为空,不需判断pos是否满足链表长度要求等。。此部分用while和if全部搞定
while(NULL!=p->pNext &&i<pos-) //不能写成<=,否则出错
{
i++;
p=p->pNext;
}
if(i>pos- || NULL==p->pNext )
return false; PNODE q=p->pNext ;
*pVal=q->data ; //删除p后面的节点
p->pNext =p->pNext->pNext;
free(q);
q=NULL; return true;
} int main(){
PNODE pHead = NULL;//定义一个结构体指针变量
pHead = create_list();
printf("排序之前的数据是:\n");
printf_list(pHead);
sort_list(pHead);
//int arr[5] = {10,80,100,20,50};
// print_array(arr,5);
//sort_array(arr,5);
//sort_list(pHead);
printf("排序之后的数据是:\n");
printf_list(pHead);
//print_array(arr,5);
return ;
}
28_链表插入和删除算法的演示.swf的更多相关文章
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...
- 数据结构Java实现03----单向链表的插入和删除
文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定) 概念: 链式存储结构是基于指针实现的.我们把一个数据 ...
- 数据结构Java实现02----单向链表的插入和删除
文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定) 概念: 链式存储结构是基于指针实现的.我们把一个数据 ...
- 面试之路(10)-BAT面试之java实现单链表的插入和删除
链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方 ...
- 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】
本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...
- C语言习题 链表建立,插入,删除,输出
Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 222 Solved: 92 [Subm ...
- 链表创建和链表遍历算法的演示_C语言
今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得: /*24_链表创建和链表遍历算法的演示*/ # include <stdio.h> ...
- 算法与数据结构(十) 二叉排序树的查找、插入与删除(Swift版)
在上一篇博客中,我们主要介绍了四种查找的方法,包括顺序查找.折半查找.插入查找以及Fibonacci查找.上面这几种查找方式都是基于线性表的查找方式,今天博客中我们来介绍一下基于二叉树结构的查找,也就 ...
- java数组及数组的插入,删除,冒泡算法
1.数组的定义 数组为相同类型的若干个数据,在一个数组里面,不能存放多种不同类型的数据,其中每个数据为该数组的一个元素,可以通过下标对改元素进行访问. 1.1 数组的特点 (1)数组被创建后,长度就已 ...
随机推荐
- Python数据分析:pandas玩转Excel (二)
1 对Excel文件的操作 方法一: 使用xlrd库或者xlwt库进行对excel表格的操作读与写: 方法二: pandas库同样支持excel的读写操作:且更加简便. 2 pd.read_excel ...
- Java IO(二)File
Java IO(二)File 一.概述 在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成.F ...
- SET运算符
-- SET操作符: -- union 联合去重 两个表的字段个数和类型都得一样,起别名 应该在第一个表上操作,,排序按照第一列从小到大来排的 select employee_id, depart ...
- 一篇文章,全面掌握Git
版本控制 版本控制就是记录项目文件的历史变化.它为我们查阅日志,回退,协作等方面提供了有力的帮助. 版本控制一般分为集中化版本控制和分布式版本控制. 集中化主要的版本数据都保存服务端. 分布式版本数据 ...
- 【Flume】知识总结
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并 ...
- Attribute (XXX) is obsolete. Its use is discouraged in HTML5 documents.
这种警告主要是因为这些属性在HTML5中过时了,并不影响代码运行,但是一些强迫症就会非常难受. 解决办法: 将程序的顶部的这句: !DOCTYPE 修改为: !DOCTYPE html PUBLIC ...
- Java实现算法提高十进制数转八进制数
算法提高 十进制数转八进制数 时间限制:1.0s 内存限制:512.0MB 编写函数,其功能为把一个十进制数转换为其对应的八进制数.程序读入一个十进制数,调用该函数实现数制转换后,输出对应的八进制数. ...
- Java实现约瑟夫环问题
约瑟夫环问题起源于一个犹太故事.约瑟夫环问题的大意如下: 罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友.剩余的39个人 ...
- 密码学DAY1_02
目录 1.1 ASCII编码 1.2 凯撒加密 1.2.1 中国古代加密 1.2.2 外国加密 1.2.3 凯撒位移加密--JAVA代码实现 1.2.4 频度分析法破解恺撒加密 1.3现代常用的加密方 ...
- Mac上查看当前安卓手机上打开的app的包名和主程序入口
1.连接上手机,数据线链接或者无线连接随便 2.打开你需要查看的app 3.打开终端,输入命令: adb shell dumpsys window w |grep \/ |grep name=