C语言将一个单链表倒置

Reverse(NODE *head)
{
NODE *p, *q, *head_a;
head_a = (NODE *)malloc(sizeof(NODE));
q = head_a;
p = head->next;
while (p)
{
head->next = p->next;
p->next = q->next;
q->next = p;
p = head->next;
}
q = head_a->next;
while (q)
{
printf("%d\n", q->data);
q = q->next;
}
//实现将单链表倒置
}
我的这个函数为什么可以运行?倒置倒是成功打印出来,但是打印完后程序的崩了。求高手解答

扣着的是头节点(头子)

车是首节点(首子)

马是次节点(次子)

牙签细的是指针指向,香头发黑的是指向,铁头细的是指向。

根据步骤写程序的伪算法(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个回答  推荐于2017-09-12
q = head_a;
p = head->next;
q->next=NULL; //加在这里
while (p)
{
head->next = p->next;
p->next = q->next;
q->next = p;
p = head->next;
}

追问

不对吧?我的q指针没有移动过,这样一来q后面的地址我就找不到了

追答已改了,你没有注意到,再粘一次
q = head_a;
p = head->next;
q->next=NULL; //加在这里!!!不然q->next的首值是个不确定值
while (p)
{
    head->next = p->next;
    p->next = q->next;
    q->next = p;
    p = head->next;
}

本回答被提问者和网友采纳

用c语言实现单链表的逆置,能将此程序详细的解释一下吗?
s=p->next; \/\/s最开始指向第一个节点 while(s->next!=NULL)\/\/只要没有到最后一个元素就继续。最后一个元素的next肯定为NULL { \/\/进入核心了楼主 t=s->next; \/\/用t指向s后面的那个元素 s->next=p; \/\/把s指向她前面那个,这个时候就实现了逆向了。而且是就地逆向。元素都没有动的 p=...

下面是用c语言编写的对不带头结点的单链表进行就地逆置的算法,求大神...
void reverse(linklist &L){ linklist p = NULL, q = L; while(q != NULL){ L = q->next; \/\/ 保留下一个节点 q->next = p; p = q; q = L; \/\/ 移动到下一个节点 } L = p; \/\/ 指向逆置后的头节点} ...

C语言实现线性表的逆置问题,顺序和单链表。在线等高手
逆置有两种方法,第一是把所有节点反过来。还有一种就是改变节点中的值。第一种情况,其实可以考虑用头插法,来实现逆置。下面的算法是基于头插法的思想,逆置链表的,仅供参考。LinkList anti_linklist(LinkList demo){ LInkList *p,*q;\/\/work pointer LinkList head;head=new LinkList();head->...

数据结构问题 C语言解答 线性表的就地逆置
q;if(L->next && L->next->next){q=p=L->next;q=q->next;p->next=NULL;while(q){\/\/每次循环将后一个结点变成新链表的第一个结点p=q;q=q->next;p->next=L->next;L->next=p;}}}上面的两个算法我都用完整的C源程序测试过了,没有问题的,希望这个对你有帮助哦,望采纳啊。...

C语言程序题: 单链表的倒序 要求输入一个单链表 如12345五个数会输出...
每次拿头元素来用头插法新建一个链表,先记住头节点的下一个不然链表要丢 用栈也行,全部压栈弹出来

求一个C语言单链表的排序函数,很急很急
用选择排序就行,代码如下。链表结构如下:typedef struct Node { T value;struct Node *link;}Node;void selectSort(Node *node){ Node *cur; \/*当前节点*\/ Node *next; \/*遍历未排序节点*\/ Node *min; \/*指向未排序节点中最小节点*\/ T temp;\/*从头节点的下一个节点开始,一直到倒数第二...

有一个线性表(a1,a2,...,an),采用带头结点的单链表L存储.设计一算法将...
\/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 *\/ Status ClearList(LinkList *L){ LinkList p,q;p=(*L)->next; \/* p指向第一个结点 *\/ while(p) \/* 没到表尾 *\/ { q=p->next;free(p);p=q;} (*L)->next=NULL; \/* 头结点指针域为空 *\/ return...

c语言中后移指针,p++;和p=p->next;是等效的吗?如果不,两者区别是什么呢...
p++ 是将p所指向的位置,往后移动1个。p=p->next;虽然在单链表中,也是后移的意思,但是,这个next是你自己定义的结构体或其他复合体的成员,next在c中根本不存在,是编写者,自己定义的一个东西,相当于一个变量,你可以定义成next,你也可以定义成nex。如果,你没有定义,就不能使用。

C语言,单链表和节点插入问题?
答案如下

关于C语言数据结构单链表初始化的问题
} void main(){ x=1; y=2;fun(x, y);...\/\/此时仍然x=1; y=2;} 但是,函数写成如下形式 void InitList(LinkList *head);可以实现引用传递参数的功能。在需要函数内部修改链表头指针时,用该形式可以解决该问题。而void InitList(LinkList head) 不可以在函数内部修改链表头指针。

相似回答