L,wang

坚持改革,开放人性的弱点……
链表的插入与反转

///////////面试时老是碰到链表反转问题,若不熟练总是会抓耳很久,今天完全自己写一个试试/////////////////////////////

#include <stdio.h>
#include <stdlib.h>

typedef struct linknode{
  int data;
  char name;
  struct linknode *next;
}* LinkNode; //此处若LinkNode不加*号,后面的head ,cur,newhead凡是结点指针都要加个*号,
      //因此可以明白为什么总是在此处加个*号,一*代百*
      //特别注意linknode与LinkNode的区别,sizeof(struct linknode)里面一定只能是这个,
      //而LinkNode只是typedef定义的一个指向结构体linknode的指针,那个*号离LinkNode多远
      //都无所谓。

LinkNode reverse(LinkNode head)
{
  LinkNode cur,tmp,newhead;
  newhead=NULL;
  cur=head;
  while(cur)
  {
    tmp=cur;
    cur=cur->next;
    tmp->next=newhead;
    newhead=tmp;
  }
  return newhead;
}

LinkNode insert(LinkNode head,int data,char name)
{
  LinkNode p;
  p=malloc(sizeof(struct linknode));
  p->data=data;
  p->name=name;
  p->next=head;
  head=p;
  return p;
}
int main(void)
{

  LinkNode head=NULL,tmp1,tmp2;
  int i;
  char n='A';
// for(i=0;i<10;i++)
// {
// LinkNode *p;
// p=malloc(sizeof(struct linknode));
// p->next=head;
// p->data=i+10;
// p->name=n++;
// head=p;
// }
//
//
  for(i=0;i<10;i++)
  {
    head=insert(head,i,n++);
   }
  tmp1=head;
  while(tmp1)
  {
    printf("%c\n",tmp1->name);
    tmp1=tmp1->next;
  }
  tmp2=reverse(head);
  printf("after reverse\n");
  while(tmp2)
  {
    printf("%c\n",tmp2->name);
    tmp2=tmp2->next;
  }

return 0;
}

 

///////////////////////////////////////Output/////////////////////////////////////////////////

J
I
H
G
F
E
D
C
B
A
after reverse
A
B
C
D
E
F
G
H
I
J

posted on 2013-04-21 16:16  L,wang  阅读(132)  评论(0编辑  收藏  举报