链表的插入与反转
///////////面试时老是碰到链表反转问题,若不熟练总是会抓耳很久,今天完全自己写一个试试/////////////////////////////
#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