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
我自己做了一个例子:里面有解释:
#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; }
此代码有解释,并且可以运行.
本文来自博客园,作者:aspirant,转载请注明原文链接:https://www.cnblogs.com/aspirant/articles/3555619.html