Linux C 单链表 读取文件 并排序 实例并解释

时间:2023-03-08 23:20:38
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.****.net/detail/yinfuqing666/6936827