扣着的是头节点(头子)
目前创新互联建站已为上千的企业提供了网站建设、域名、雅安服务器托管、网站改版维护、企业网站设计、凯里网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
车是首节点(首子)
马是次节点(次子)
牙签细的是指针指向,香头发黑的是指向,铁头细的是指向。
根据步骤写程序的伪算法(3步4循环,7张图片搞定),如下:
以下是while循环(条件:香头指向不为空)
第一个循环把马弄到车前面,
第二个循环把相弄到马前面
第三个循环把士弄到相前面
........
直到香指向为空后停止循环。
代码如下:只需要一个首结点pHead,就能把链表找到,并倒置。具体代码如下
p香=pHead-pNext;
p铁=p香-pNext;
p香-pNext=NULL;
P香=p铁
while(p香 !=NULL)
{
p铁=p香-pNext;
p香-pNext=pHead-pNext;
pHead-pNext=p香;
p香=p铁;
}
对照伪算法(三步四循环),和上面的代码是一一对应的:
第一步:香头指向首子,铁头指向次子
第二步:删掉首子指向次子(铁头所指向的那个子)的牙签
第三步:香头跟着铁头
以下循环条件:(条件:香头指向不为空)
{
循环1:铁头移动到香头的下一个指向
循环2:香头的下一个指向首子
循环3:头子的下一个跟着香头
循环4:香头跟着铁头
}
自己用道具操作几遍,然后把流程背会,以后自己根据流程写代码即可。
单链表反转很简单,只说下思路:
1,从头到尾循环遍历链表
2,取下头结点,作为尾结点,尾结点此时也为头结点
3,采用前插法,将步骤二中取下的结点一个一个连接到头结点前面,成为新的头结点。
4,链表全部遍历完后,新的链表产生了,是原来链表的反转。
#includecstdio
#includecstdlib
struct Node{
char name[50];
int salary;
Node* next;
};
Node* createNode()
{
Node* lastnode = 0;
Node* head = 0;
int num;printf("请输入员工的个数:");scanf("%d",num);
char buf[50];
for(int i=0;inum;++i)
{
Node* node = new Node;
printf("请输入员工%d的名字:",i+1);scanf("%s",node-name);
printf("请输入员工%d的工资:",i+1);scanf("%s",buf);node-salary=atoi(buf);
if(lastnode!=0) lastnode-next=node; else head=node;
lastnode=node;
}
lastnode-next=0;
return head;
}
Node* reverseNode(Node* head)
{
Node* iter = head;
Node* lastiter = 0;
while(iter!=0)
{
Node* temp=iter-next;
iter-next=lastiter;
lastiter=iter;
iter=temp;
}
return lastiter;
}
Node* printNode(Node* head)
{
Node* iter = head;
while(iter!=0)
{
printf("员工的名字:%s 员工的工资:%d\n",iter-name, iter-salary);
iter=iter-next;
}
}
int main()
{
Node* head = createNode();
printNode(head);
printf("反转:\n");
Node* head2 = reverseNode(head);
printNode(head2);
return 0;
}
两处scanf("%c",data);后面都要加一行getchar();
另外代码中的%s要改成%c