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的文本为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Phuong Hoan 1 , 2234 , Jan 25 th 20141 , 2011231 Phuong Hoan 2 , 2334 , Jan 25 th 20142 , 2011232 Phuong Hoan 3 , 3434 , Jan 25 th 20143 , 2011233 Phuong Hoan 4 , 5634 , Jan 25 th 20144 , 2011234 Phuong Hoan 5 , 7834 , Jan 25 th 20145 , 2011235 Phuong Hoan 6 , 8934 , Jan 25 th 20146 , 2011236 Phuong Hoan 7 , 9034 , Jan 25 th 20147 , 2011237 Phuong Hoan 8 , 2434 , Jan 25 th 20148 , 2011238 Phuong Hoan 9 , 2534 , Jan 25 th 20149 , 2011239 Phuong Hoan 10 , 2634 , Jan 25 th 20110 , 20112310 Phuong Hoan 11 , 2734 , Jan 25 th 2011 , 20112311 Phuong Hoan 12 , 2834 , Jan 25 th 20112 , 20112312 Phuong Hoan 13 , 2934 , Jan 25 th 20113 , 20112313 Phuong Hoan 14 , 3734 , Jan 25 th 20114 , 20112314 Phuong Hoan 15 , 3834 , Jan 25 th 20115 , 20112315 Phuong Hoan 16 , 3934 , Jan 25 th 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=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; 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 0; }
此代码有解释,并且可以运行.
代码下载地址: http://download.csdn.net/detail/yinfuqing666/6936827
本文来自博客园,作者:aspirant,转载请注明原文链接:https://www.cnblogs.com/aspirant/p/3555791.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?