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 单链表 读取文件 并排序 实例并解释的更多相关文章

  1. c语言之单链表的创建及排序

    今天对之前学习过的链表知识进行简单的总结顺便写点代码:创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数 下面代码贴出具体代 ...

  2. Linux内核单链表

    主要说明Linux内核中单链表操作的关键思想,需要注意的地方 1. 假设 为了说明关键思想,对数据结构进行了精简 2. 数据结构定义 struct ListNode { int val; ListNo ...

  3. Linux C++ 单链表添加,删除,输出,逆序操作

    /*单链表操作*/#include <iostream>using namespace std; class Node{ public: Node(){ next=0; } Node(in ...

  4. Linux C++ TCP Socket传输文件或图片实例

    环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...

  5. linux 一行一行的读取文件

    #!/bin/bash #reading data from a file count= cat test1 | while read line do echo "Line $count: ...

  6. Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序

    直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:

  7. 史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)

    目录 1.准备工作 2.创建链表 3.打印链表 4.在元素后面插入元素 5.在元素前面增加元素 6.删除链表元素,要注意删除链表尾还是链表头 7.根据传入的数值查询链表 8.修改链表元素 9.求链表长 ...

  8. c++单链表基本功能

    head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...

  9. 面试之路(10)-BAT面试之java实现单链表的插入和删除

    链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方 ...

随机推荐

  1. 简短的几句js实现css压缩和反压缩功能

    写在前面 最近一直在整理css,但因为现在Visual Studio 2013太智能了,它每每在我按ctrl+E+D进行格式化代码的时候,就会将css进行层次格式化(如下图所示),而这个格式让我老大实 ...

  2. aapt aidl

    AIDL:Android Interface Definition Language,即Android接口定义语言 aapt即Android Asset Packaging Tool,在SDK的bui ...

  3. abstract 类 构造函数

    public abstract class CommonReq { private String TransNo { get; set; } public String SubmitData { ge ...

  4. swift项目中引入OC框架

  5. linux 访问tomcat 管理页面时 You are not authorized to view this page 403(真实可用)

    ava代码 收藏代码 You are not authorized to view this page. If you have not changed any configuration files ...

  6. 微信用户量破6.5亿 首超移动QQ

    腾讯控股有限公司昨日公布了微信和WeChat合并月活跃用户量达到6.5亿,同比再涨39%.QQ在移动智能终端月活为6.39亿,同比增长18%,尽管势头也不错,但这是第一次,微信干掉了移动QQ! 201 ...

  7. [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性

    许多js环境都提供检查调用栈的功能.调用栈是指当前正在执行的活动函数链.在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.cal ...

  8. [Effective JavaScript 笔记]第39条:不要重用父类的属性名

    假设想给上节讲的场景图库添加收集诊断信息的功能.这对于调试和性能分析很有用. 38条示例续 给每个Actor实例一个唯一的标识数. 添加标识数 function Actor(scene,x,y){ t ...

  9. LVS负载均衡集群服务搭建详解(一)

    LVS概述 1.LVS:Linux Virtual Server 四层交换(路由):根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(根据调度算法): 不能够实现应用层的负载均 ...

  10. linux 如何清理僵尸进程

    今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程. 26327 ?        S      0:05  \_ /usr/bin/python /usr/bin/nova- ...