数据结构-关与C++链表插入与倒置问题

本文介绍了如何在C++中使用链表,包括通过前插法创建链表,打印链表数据以及倒置链表的方法。在倒置链表时强调了不能直接将头结点作为尾结点,而是要保留头结点并将其后续节点进行倒置,最后链接回头结点。示例代码展示了完整的实现过程。
摘要由CSDN通过智能技术生成

@关与C++链表插入与倒置问题

学习目标:

掌握C++链表插入与倒置问题
学会新建链表,倒置数据,打印数据

学习内容:

1、 引入C++模板库 2、 学会struct结构体递归嵌套使用 3、 懂得使用前插法插入链表数据 4、 掌握倒置链表的数据方法

目标结构:

结构体内容:

// An highlighted block
typedef struct LNode{
	string name;
	ElemType data;
	struct LNode *next; //神马,结构体也可以递归??? 只能用指针哦!不然会报错~ 
}LNode,*LinkList; 

前插法创建数据链

LinkList CreateList(int n,double j[],string name[]){
	LNode *q,*L; //分别代表尾节点,新生节点,头节点
	L = new LNode;
	L -> next = NULL;
	for(int i=0;i<n;i++){
		q=new LNode;
		q->data=j[i];
		q->name=name[i];
		q->next = L->next; 
		L->next= q;
	} 
	return L;//一定得返回头节点啊!!! 
}

打印数据内容

void PrintList(LinkList L){
    LNode *p;
    p=L->next;  /*p指向单链表的第1个元素*/
    while(p){
    //	printf("%5d",p->name);
	   //p=p->next;
       cout << p->name <<endl;
       cout << p->data <<endl;
       p=p->next;
    }
}

倒置列表元素(关键):
CSDN看了一些帖子,直接将头结点置为尾结点,这是不对的!!!,头结点只起指向作用,里面木有data,被绕晕了很久总算想明白了~~头结点当尾结点是里面不能存放data,需保留头结点再将其后面的结点倒置,最后链接到头结点上~

LinkList UpSideDown(LinkList L){
	LNode *p,*q,*r; //创建三个元素用来存放结点
   p=L->next; //存放首结点地址 
   q=p->next; //存放首结点的指向 
   p->next=NULL;//将其指向置为null,当尾结点使 
   while(q){ //开始置换 
   	r=q->next; //r存放首结点后面一个结点的指向 
   	q->next=p; //将它的指向置为 首/前一个 结点 
   	p=q;//将当前置换的结点变为前结点 
   	q=r; //把前一个结点往下行 
   }
   L->next = p; //将已经链好的结点付到头结点后面 
   return L; //返回链表 
	 
} 


学习产出:

以下是完成的完整代码
#include <iostream>
#include <String>
#define ERROR 0
#define OK 1
using namespace std;
typedef double ElemType;
typedef struct LNode{
	string name;
	ElemType data;
	struct LNode *next; //神马,结构体也可以递归??? 只能用指针哦!不然会报错~ 
}LNode,*LinkList; 
//前插法创建数据链 
LinkList CreateList(int n,double j[],string name[]){
	LNode *q,*L; //分别代表尾节点,新生节点,头节点
	L = new LNode;
	L -> next = NULL;
	for(int i=0;i<n;i++){
		q=new LNode;
		q->data=j[i];
		q->name=name[i];
		q->next = L->next; 
		L->next= q;
	} 
	return L;//一定得返回头节点啊!!! 
}
//打印数据内容 
void PrintList(LinkList L){
    LNode *p;
    p=L->next;  /*p指向单链表的第1个元素*/
    while(p){
    //	printf("%5d",p->name);
	   //p=p->next;
       cout << p->name <<endl;
       cout << p->data <<endl;
       p=p->next;
    }
}
//倒置列表元素
//LinkList UpSideDown(LinkList L){
//	LNode *p,*q,*r; //创建三个元素用来存放结点
//	p=L->next; //存放头结点地址,待会用来放在最后
//	q=p->next; //存放首元结点,等会用
//	 //因为要将头结点放置在最末尾,将其next指向置为NULL
//	while(q){ //开始置换 
//	//cout << q->data;
//		r=q->next; //r用来存放当前节点的后一个节点
//		q->next=p; //将本来指向下一个结点置为前一个结点 
//		p=q;//将当前节点变为前结点 
//		q=r; //当前结点继续向下行 
//			} 
//	L->next=p;//让头结点变为末尾的结点 
//	return L; //返回链表 
//	 
//} //算法出错,头结点当尾结点是里面不能存放data,需保留头结点再将其后面的结点倒置,最后链接到头结点上~ 
LinkList UpSideDown(LinkList L){
	LNode *p,*q,*r; //创建三个元素用来存放结点
   p=L->next; //存放首结点地址 
   q=p->next; //存放首结点的指向 
   p->next=NULL;//将其指向置为null,当尾结点使 
   while(q){ //开始置换 
   	r=q->next; //r存放首结点后面一个结点的指向 
   	q->next=p; //将它的指向置为 首/前一个 结点 
   	p=q;//将当前置换的结点变为前结点 
   	q=r; //把前一个结点往下行 
   }
   L->next = p; //将已经链好的结点付到头结点后面 
   return L; //返回链表 
	 
} 

int main(){
	LinkList L=NULL;  
	double Price[4] = {24.9,29,48,90};
//	double p=Price[1]; 
//	printf("%f",p);
	string Name[4] = {"小苹果2020","红苹果2020","大苹果2020","大红苹果2020"};
//cout << Name[2];
	L = CreateList(4,Price,Name);  
	PrintList(L);
	cout << "倒置以后:\n" ;
	L = UpSideDown(L);
	PrintList(L);
}

博主第一次写文章,有错误恳请指证别介意~~~

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值