单向链表每隔K个逆序输出

qq_38190854 2018-04-03 09:10:21
输入一个单向链表,使这个链表每k个元素便逆序输出,下面是我用的程序,运行不出结果,问题应该是出在reverse函数上,请大神帮我看一下,非常感谢
#include<iostream>
#include<stdlib.h>
using namespace std;
struct node
{
int data;
node * next;

};
typedef node* nodeptr;
nodeptr reverse(nodeptr& head,int k)
{

nodeptr now=head;
int cnt=1;
nodeptr old,tmp;
old=now->next;
tmp=old->next;
while(cnt<k&&head&&old)
{
old->next=now;
now=old;
old=tmp;
tmp=old->next;
cnt++;
}
while(old)
head->next=reverse(old,k);

return now;
}
void push(nodeptr& head, int data)
{
if (head == NULL)
{
node* newnode = new node;
newnode->data = data;
newnode->next = NULL;
head = newnode;
}
else
{
node* newnode = new node;
newnode->data = data;
newnode->next = head;
head = newnode;
}
}
void print(nodeptr head)
{
while (head)
{
cout << head->data <<" ";
head = head->next;

}
}
/*void clear(nodeptr head)
{
while(head)
{delete head;
head=head->next;
}
}*/
int main()
{
using namespace std;
nodeptr head = NULL;
nodeptr end = NULL;
push(head, 8);
push(head, 7);
push(head, 6);

print(head);
end=reverse(head,2);
print(end);

system("pause");
return 0;
}
...全文
523 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-04
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
MHY1249 2018-04-04
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <Windows.h>
#include <string>
using namespace std;

typedef struct linkNode{
	int nData;
	struct linkNode *pNext;
}LINKNODE,*PLINKNODE;


void showLink(LINKNODE *pHead){
	if(!pHead || !pHead->pNext){
		return ;
	}
	
	LINKNODE *pData = pHead->pNext;

	while(pData){
		printf("%d ",pData->nData);
		pData=pData->pNext;
	}
	
	printf("\n");
	return ;
}

void freeLink(LINKNODE * &pHead){
	if(!pHead || !pHead->pNext){
		return ;
	}

	LINKNODE *pData = pHead->pNext;
	while(pData){
		LINKNODE *pTemp = pData->pNext;
		free(pData);
		pData = pTemp;
	}

	pHead->pNext = NULL;
	
	return ;
}

// 后插法 
void createLink(int nNumber,LINKNODE * &pHead){
	if(!pHead){
		pHead = (PLINKNODE)malloc(sizeof(LINKNODE));
	}	

	LINKNODE *pData = pHead;

	while(nNumber-->0){
		LINKNODE *pTempNode = (PLINKNODE)malloc(sizeof(PLINKNODE));
		printf("请输入链表中的数值: \n");
		scanf("%d",&pTempNode->nData);
		pTempNode->pNext = NULL;
		pData->pNext = pTempNode;
		pData = pData->pNext;
	}

	showLink(pHead);
}

// 前插法
void addLinkByPreInsert(LINKNODE * &pHead,int nData){
	if(!pHead){
		return ;
	}
	
	LINKNODE *pData = (PLINKNODE)malloc(sizeof(LINKNODE));
	pData->nData = nData;
	if(!pHead->pNext){
		pHead->pNext= pData;
		pData->pNext = NULL;
	}else{
		LINKNODE *pTemp = pHead->pNext;
		pHead->pNext = pData;
		pData->pNext = pTemp;
	}
	
	return ;
}

void reverseLink(LINKNODE *pHead){
	if(!pHead || !pHead->pNext){
		return ;
	}

	printf("请输入k值: \n");
	int k = 0;
	scanf("%d",&k);
	
	LINKNODE *pNewLink = (PLINKNODE)malloc(sizeof(LINKNODE));
	pNewLink->pNext = NULL;
	
	int i = 0;
	LINKNODE *pData = pHead->pNext;
	while(pData){
		if(i == k){
			showLink(pNewLink);
			freeLink(pNewLink);
			i = 0;
		}

		addLinkByPreInsert(pNewLink,pData->nData);
		pData=pData->pNext;
		i++;
	}

	if(pNewLink->pNext){
		showLink(pNewLink);
	}
	
	return ;
}



int _tmain(int argc, _TCHAR* argv[])
{
	
	LINKNODE *pHead  = NULL;
    createLink(10,pHead);
	reverseLink(pHead);

	return 0;
}
可以参考一下
paschen 版主 2018-04-03
  • 打赏
  • 举报
回复
old = now->next; 这句执行后,old可能为NULL,再执行后面的tmp = old->next;访问了NULL指针,导致程序崩溃
qq_38190854 2018-04-03
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
需求能更详细一些吗?每k个逆序输出。建议举个例子,怎么算是每隔k个逆序输出
不好意思,没说清楚,比如链表是1-2-3-4-5-6-7-8,每三个逆序输出,则输出变成了3-2-1-6-5-4-8-7
自信男孩 2018-04-03
  • 打赏
  • 举报
回复
需求能更详细一些吗?每k个逆序输出。建议举个例子,怎么算是每隔k个逆序输出

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧