Linux C 单链表 读取文件 并排序 实例并解释
C的指针挺头疼的,先看一个例子:
给指针赋值和通过指针进行赋值这两种操作的差别确实让人费解。谨记区分的重要方法是:如果对左操作数进行解引用,则修改的是指针所指对象的值; 如果没有使用解引用操作,则修改的是指针本身的值。
帮助理解下列例子:
string s1 ("some value");
string *sp1 = &s1; // sp1 ------> s1 :some value
string s2 ("another");
string *sp2 = &s2; // sp2 --------> s2: another
*sp1 = "a new value"; // sp1---------> s1:a new value
sp1 = sp2; // sp1----------> s2:another
下面是我做的使用单链表读取文件,并 显示:
test3的文本为:
Phuong Hoan1, 2234, Jan 25th 20141, 2011231
Phuong Hoan2, 2334, Jan 25th 20142, 2011232
Phuong Hoan3, 3434, Jan 25th 20143, 2011233
Phuong Hoan4, 5634, Jan 25th 20144, 2011234
Phuong Hoan5, 7834, Jan 25th 20145, 2011235
Phuong Hoan6, 8934, Jan 25th 20146, 2011236
Phuong Hoan7, 9034, Jan 25th 20147, 2011237
Phuong Hoan8, 2434, Jan 25th 20148, 2011238
Phuong Hoan9, 2534, Jan 25th 20149, 2011239
Phuong Hoan10, 2634, Jan 25th 20110, 20112310
Phuong Hoan11, 2734, Jan 25th 2011, 20112311
Phuong Hoan12, 2834, Jan 25th 20112, 20112312
Phuong Hoan13, 2934, Jan 25th 20113, 20112313
Phuong Hoan14, 3734, Jan 25th 20114, 20112314
Phuong Hoan15, 3834, Jan 25th 20115, 20112315
Phuong Hoan16, 3934, Jan 25th 20116, 20112316
我自己做了一个例子:使用单链表读取上面的文件并排序显示并有注释:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;/*data代表成绩分数*/
struct node *next;
}LNode,*LinkList;
LinkList Creat(void)/*创建链表,结束标志为当输入的数据为0!*/
{
LinkList H,p1,p2;
int n;
n=;
p1=p2=(LinkList)malloc(sizeof(LNode));
printf("输入数据:");
scanf("%d",&p1->data);
H=NULL;
while(p1->data!=)
{
n=n+;
if(n==)
H=p1;
else
p2->next=p1;
p2=p1;
p1=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p1->data);
}
p2->next=NULL;
return(H);
}
//上一段代码的解释(注意H是head头指针,P2是尾指针):
// 1轮:n=1 H=P1(p1指向一块儿data=用户输入值的地址,) p2=p1(P2也指向这块data=用户输入值的地址);
// p1=(LinkList)malloc(sizeof(LNode))==>(解释:P1不再指向这块地址,P1开始指向了新申请的地址)
//p2->next=NULL(将p2指针的next置为空);也就是说一轮结束之后:出现了H(头指针)和P2(尾指针)同时指向一块儿Data区域,且此区域的next=null;
// 二轮 n=2 p2->next=p1(p2指向的struct的next指针置为P1,结果为:H->地址一->P1)
// 然后p2=p1(P2不再指向原先的地址,现在P2指向了现在P1的位置,这样P2仍然是尾接点指针,H头指针不变,但是节点增加了新的P1)
// p1=(LinkList)malloc(sizeof(LNode));解释:P1不再指向原先的地址,新开辟一块儿地址,由P1指向它;
// p2->next=NULL; 将尾指针的next置为空,现在的链表为:H->Data1->Data2->P2(P2尾指针的next=NULL);
//3轮之后同理....
//最终返回了头指针H LinkList Sort(LinkList SL)/*递增排序函数:入口参数:链表的头指针,此为链表中的排序函数*/
{
LinkList p,q;
int temp;
for(p=SL;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data>q->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
return SL;
}
// for(p=SL;p!=NULL;p=p->next)意思为遍历SL,一个个往下走,
//for(q=p->next;q!=NULL;q=q->next) 意思为:先拿 第二个元素与第一个元素比较,假如第一个大的话,1与2互换,否则不作处理
//然后拿第三个与第一个比较,假如第三个大的话,第三个元素与第一个元素互换,否则不做处理
//这样,第一轮过后,保证第一个元素是最小的,
//第二轮过后 第二个是次小的,这样,依次类推,由小到大就这样形成了.
int main()
{
LinkList L,S,K;
L=Creat();
printf("初始化的单链表数据序列为:\n");
for(S=L;S!=NULL;S=S->next)
printf("%d ",S->data);
Sort(L);
printf("\n按递增顺序排序后的序列为:\n");
for(K=L;K!=NULL;K=K->next)
printf("%d==>",K->data); return ;
}
此代码有解释,并且可以运行.
代码下载地址: http://download.csdn.net/detail/yinfuqing666/6936827
Linux C 单链表 读取文件 并排序 实例并解释的更多相关文章
- c语言之单链表的创建及排序
今天对之前学习过的链表知识进行简单的总结顺便写点代码:创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数 下面代码贴出具体代 ...
- Linux内核单链表
主要说明Linux内核中单链表操作的关键思想,需要注意的地方 1. 假设 为了说明关键思想,对数据结构进行了精简 2. 数据结构定义 struct ListNode { int val; ListNo ...
- Linux C++ 单链表添加,删除,输出,逆序操作
/*单链表操作*/#include <iostream>using namespace std; class Node{ public: Node(){ next=0; } Node(in ...
- Linux C++ TCP Socket传输文件或图片实例
环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...
- linux 一行一行的读取文件
#!/bin/bash #reading data from a file count= cat test1 | while read line do echo "Line $count: ...
- Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序
直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:
- 史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)
目录 1.准备工作 2.创建链表 3.打印链表 4.在元素后面插入元素 5.在元素前面增加元素 6.删除链表元素,要注意删除链表尾还是链表头 7.根据传入的数值查询链表 8.修改链表元素 9.求链表长 ...
- c++单链表基本功能
head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...
- 面试之路(10)-BAT面试之java实现单链表的插入和删除
链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方 ...
随机推荐
- HDU 2255 奔小康发大财
传送门 Solution: KM算法 关于KM算法有一篇极好的文档http://www.cse.ust.hk/~golin/COMP572/Notes/Matching.pdf Implementat ...
- chroot详解
我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...
- Win7 + ubuntu14.04 双系统
安装主要分为以下几步:一. 下载Ubuntu 14.04镜像软件:二. 制作U盘启动盘:三. 安装Ubuntu系统:四. 用EasyBCD 创建启动系统. 1. 下载 Ubuntu 14.04 直接到 ...
- Windows 下的.NET+ Memcached安装
转载请标明出处: http://www.yaosansi.com/ 原文:http://www.yaosansi.com/post/1396.html Memcached官方:http://danga ...
- C# 三种实现抖屏的方式
//int a = -2; //this.BringToFront(); //for (int i = 0; i < 20; i++) //{ // a = -a; // this.Locati ...
- 繁华模拟赛 vicent的字符串
#include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...
- UCloud可用区的设计理念及功能图文详解
导读 过去的几个月内,UCloud对自身的云计算基础架构进行了全面升级,于日前宣布基础架构全面支持地域和可用区,并将可用区项目命名为Sixshot.通过这两层的设计架构来组织云服务,可以为用户提供高可 ...
- Unity中下载和本地保存实例
原地址:http://www.linuxidc.com/Linux/2011-10/45888.htm Download.cs using UnityEngine; using System.Coll ...
- i3D的一篇Unity教程中的笔记
原地址:http://blog.sina.com.cn/s/blog_72b936d80100wwej.html 以下是i3D的一篇Unity教程中的笔记. i3D的这篇教程是[i3D.Next-Ge ...
- change column to bigint
今天存储数据的时候报错,发现是3435065640超出了常规int的存储长度, RangeError (3435065640 is out of range for ActiveRecord::Typ ...