linux写链表排序的模块,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#includetypedefstructnode

{int data;/*data代表成绩分数*/

struct node *next;

}LNode,*LinkList;

LinkList Creat(void)/*创建链表,结束标志为当输入的数据为0!*/{

LinkList H,p1,p2;intn;

n=0;

p1=p2=(LinkList)malloc(sizeof(LNode));

printf("输入数据:");

scanf("%d",&p1->data);

H=NULL;while(p1->data!=0)

{

n=n+1;if(n==1)

H=p1;elsep2->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;inttemp;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;

}

}

}returnSL;

}//for(p=SL;p!=NULL;p=p->next)意思为遍历SL,一个个往下走,//for(q=p->next;q!=NULL;q=q->next) 意思为:先拿 第二个元素与第一个元素比较,假如第一个大的话,1与2互换,否则不作处理//然后拿第三个与第一个比较,假如第三个大的话,第三个元素与第一个元素互换,否则不做处理//这样,第一轮过后,保证第一个元素是最小的,//第二轮过后 第二个是次小的,这样,依次类推,由小到大就这样形成了.

intmain()

{

LinkList L,S,K;

L=Creat();

printf("初始化的单链表数据序列为:");for(S=L;S!=NULL;S=S->next)

printf("%d",S->data);

Sort(L);

printf("按递增顺序排序后的序列为:");for(K=L;K!=NULL;K=K->next)

printf("%d==>",K->data);return 0;

}

此代码有解释,并且可以运行.

代码下载地址: http://download.csdn.net/detail/yinfuqing666/6936827

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值