zoukankan      html  css  js  c++  java
  • 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=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("初始化的单链表数据序列为:
    ");
    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

  • 相关阅读:
    Sightseeing,题解
    A Simple Problem,题解
    城池攻占,题解
    传递,题解
    How many ways??,题解
    Least Cost Bracket Sequence,题解
    Evacuation,题解
    Tallest Cow,题解
    容易题,题解
    无题Ⅱ,题解
  • 原文地址:https://www.cnblogs.com/aspirant/p/3555791.html
Copyright © 2011-2022 走看看