单链表的整表创建与逆序(转置)
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
结点声明
typedef struct Node
{
ElemType data;
struct Node *next;
}Node, *Linklist;
1.每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置)
2.声明了结构数据类型Node,和结构指针Linklist
单链表的整表创建
void CreateListTail(Linklist *L,int n){
Linklist p,r;
int i;
//srand(time(0));
*L=(Linklist)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++){
p=(Node*)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;
r=p;
}
r->next=NULL;
}
- [ 1] 这里使用随机函数rand()给单链表的每个结点赋值。但是随机数的产生需要一个种子,如果种子相同每次产生的随机数序列也会相同。
rand() 是产生一个随机整数的函数,其分布范围是0到最大的整数, rand() %100 指和100取余,得到一个0到99整数
rand() %100 +1 得到一个1到100的整数 - [ 2] 使用srand()函数随机初始化种子。如果不用srand(time(NULL));,会发现每次程序运行得到的随机数都是一样,也就失去了随机数的意义。
关于rand()和srand()的描述 - 3这里链表的创建使用尾插法,类似的创建方法还有头插法
关于链表的转置
Linklist reverse(Linklist *L){
Linklist p,q,pr;
p=(*L)->next;
q=NULL;
(*L)->next=NULL;
while(p){
pr=p->next;
p->next=q;
q=p;
p=pr;
}
(*L)->next=q;
return *L;
}
- 由于是对链表进行修改,函数Linklist reverse(Linklist *L)实参与形参的赋值必须传引用,如果是(Linklist L)没有修改到实参。
- 注意这里的L(头结点)是一个二级指针,将其赋值给一级指针p时必须用
p=(*L)->next //p是一个一级指针
3.关于转置:
首先让头节点与第一个元素节点断开,但是要注意在断开之前需要用p指针指向第一个元素节点来保存第一个元素节点的位置,然后再断开。在这里有一个指针q指向一个指针域为空的节点,这个节点用来做为链表反转后的最后一个节点。
让第二个元素节点的指针从指向第三个元素节点变为指向第一个元素节点,以此类推,直至指针p指向原链表最后一个元素。
p指针指向NULL时,让原头节点的指针域指向原来最后一个元素节点。此时链表倒置已完成。
详细:https://blog.csdn.net/blioo/article/details/62050967
单链表的整表读取
void read(Linklist L,int n){
printf("该单链表为:\n");
Linklist p;
p=L->next;
int i;
for(i=0;i<n;i++){
printf("%d ",p->data);
p=p->next;
}
}
完整的代码
#include <iostream>
#include <stdio.h>
#include<time.h>
#include<stdlib.h>
typedef int ElemType;
using namespace std;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node, *Linklist;
void CreateListTail(Linklist *L,int n){
Linklist p,r;
int i;
//srand(time(0));
*L=(Linklist)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++){
p=(Node*)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;
r=p;
}
r->next=NULL;
}
void read(Linklist L,int n){
printf("该单链表为:\n");
Linklist p;
p=L->next;
int i;
for(i=0;i<n;i++){
printf("%d ",p->data);
p=p->next;
}
}
Linklist reverse(Linklist *L){
Linklist p,q,pr;
p=(*L)->next;
q=NULL;
(*L)->next=NULL;
while(p){
pr=p->next;
p->next=q;
q=p;
p=pr;
}
(*L)->next=q;
return *L;
}
int main(){
Linklist L;
int n=10;
CreateListTail(&L,n);
read(L,n);
reverse(&L);
read(L,n);
return 0;
}