当前位置:首页 » 操作系统 » 链表倒序算法

链表倒序算法

发布时间: 2022-08-02 06:04:53

1. 链表倒序排列

例:ABC DEF
结果1:FED CBA
结果2:DEF ABC
以下给出的两个程序都是用堆栈的方法接收,从而倒序!
/*结果1*/
#include "stdio.h"
#include <stdlib.h>
#define N 5
struct str
{
char a;
struct str *next;
};
struct str *creat(struct str *head)
{
int i;
struct str *p1;
printf("请输入5个字符:");
for(i=0;i<N;i++)
{
p1=malloc(sizeof(struct str));
p1->a=getche();
p1->next=head;
head=p1;
}
return(head);
}
void main()
{
struct str *head;
head=NULL;
head=creat(head);
printf("\n");
do{
printf("%c",head->a);
head=head->next;
}while(head!=NULL);

}
/*结果2*/
#include "stdio.h"
#include <stdlib.h>
#define N 3
struct str
{
char a[30];
struct str *next;
};
struct str *creat(struct str *head)
{
int i;
struct str *p1;
for(i=0;i<N;i++)
{
printf("输输入3个字符串:\n");
p1=malloc(sizeof(struct str));
gets(p1->a);
p1->next=head;
head=p1;
}
return(head);
}
void main()
{
struct str *head;
head=NULL;
head=creat(head);
do{
printf("%s ",head->a);
head=head->next;
}while(head!=NULL);

}

2. 链表的倒序

//基本思路:头指针逐渐一到链表尾,同时将各个节点连接反向
//h是指向表头结点的指针
p = h->next;
while(p)
{
q=p;
p=p->next;
q->next=h->next;
h->next=q;
}

3. c语言单链表倒序函数,怎么写

扣着的是头节点(头子)

车是首节点(首子)

马是次节点(次子)

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

根据步骤写程序的伪算法(3步4循环,7张图片搞定),如下:


第一个循环把马弄到车前面,

第二个循环把相弄到马前面

第三个循环把士弄到相前面

........

直到香指向为空后停止循环。

代码如下:只需要一个首结点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:香头跟着铁头

}

自己用道具操作几遍,然后把流程背会,以后自己根据流程写代码即可。

4. C语言单链表节点倒置的算法问题

扣着的是头节点(头子)

车是首节点(首子)

马是次节点(次子)

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

根据步骤写程序的伪算法(3步4循环,7张图片搞定),如下:


第一个循环把马弄到车前面,

第二个循环把相弄到马前面

第三个循环把士弄到相前面

........

直到香指向为空后停止循环。

代码如下:只需要一个首结点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:香头跟着铁头

}

自己用道具操作几遍,然后把流程背会,以后自己根据流程写代码即可。

5. 三个关于链表的算法问题,分别是排序,插入和倒序

#include<stdlib.h>
#include<stdio.h>
#defineCOUNT5//初始5个结点的链表
structnode{
intnum;
node*next;
};
node*creat();//创建新链表(5个结点)
voidprint(node*);//遍历链表
node*add(node*);//添加插入一个结点
intisSort(node*);//判断其数据项是否按从小到大排列
node*reverse(node*);//反转链表
voidmain()
{
node*head;
head=creat();
print(head);
head=add(head);
print(head);
head=reverse(head);
print(head);
if(0==isSort(head))printf("不是按从小到大排序 ");
elseprintf("是按从小到大排序 ");
}
node*creat()
{
node*p1,*p2,*head;
head=NULL;
p1=p2=(node*)malloc(sizeof(node));
p1->num=1;//头结点
head=p1;
for(inti=1;i<=COUNT;i++)
{
p1=(node*)malloc(sizeof(node));
p1->num=(100*rand())/(RAND_MAX*1.0);//0~100间的随机数
p2->next=p1;
p2=p1;
}
p2->next=NULL;
returnhead;
}
voidprint(node*head)
{
if(head==NULL){printf("It'saemptylist ");return;}
node*first=head;
while(first!=NULL)
{
printf("%d",first->num);
first=first->next;
}
printf(" ");
}
intisSort(node*head)
{
if(head==NULL){printf("It'saemptylist ");return0;}
node*p=head;
while(p->next!=NULL)
{
if(p->num>p->next->num)return0;//发现有后一个比前一个值小则结束查找
p=p->next;
}
return1;
}
node*reverse(node*head)
{
node*pre,*cur,*nex;
if(head==NULL){printf("It'saemptylist ");returnhead;}
pre=head;
cur=head->next;
while(cur)
{
nex=cur->next;//保存下一个结点
cur->next=pre;//当前结点的下一个结点指向前一个结点,实现反转
pre=cur;//pre和cur都依次后移一个结点
cur=nex;
}
head->next=NULL;//处理旧链表的头结点(即新链表的尾结点)
head=pre;
returnhead;
}

哦,忘了头结点指针是first,你把所有head替换成first就OK了。

6. 如何实现链表的倒序输出

如下:
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
int data;
node* pNext;
}Node;

//链表的操作,以有头节点为例,无头节点类似
Node* head = NULL;

//创建链表,头结点data=0,pNext=NULL;
bool createNodeList()
{
head = (Node*) malloc(sizeof(Node));
if(NULL == head)
{
return false;
}
else
{
head->data = 0;
head->pNext = NULL;
return true;
}
}

//增加节点
bool addNode(Node* node)
{
if(NULL == head)
{
return false;
}
Node* p = head->pNext;
Node* q = head;
while(NULL != p)
{
q = p;
p = p->pNext;
}
q->pNext = node;
node->pNext = NULL;
return true;
}

//删除节点
bool deleteNode(int index)
{
if(NULL == head)
{
return false;
}
Node* p = head->pNext;

int length = 0;
while(NULL != p)
{
length ++;
p = p->pNext;
}

if(length < index)
{
return false;
}
else
{
Node* q = head;
p = head;
for(int i=0;i<index;i++)
{
q = p;
p = p->pNext;
}
Node* t = p->pNext;
q->pNext = t;
free(p);
return true;
}
}

//逆序
void reverseNodeList()
{
if(NULL == head)
{
return;
}
//如果链表长度为1
if(head->pNext == NULL)
{
return;
}
Node* p = head->pNext;
Node* q = p->pNext;
Node* t = NULL;
while(NULL != q)
{
t = q->pNext;
q->pNext = p;
p = q;
q = t;
}
head->pNext->pNext = NULL;
head->pNext = p;
}

//排序(降序)
void sort()
{
//冒泡排序
Node* pHead = head;
if(head == NULL)
{
return;
}
if(pHead->pNext == NULL)
{
return;
}
Node* pi = pHead->pNext;
Node* pj = pi->pNext;
for(;pi != NULL;pi=pi->pNext)
{
for(pj = pi->pNext;pj != NULL;pj=pj->pNext)
{
if(pj->data>pi->data)
{
int tmp = pj->data;
pj->data = pi->data;
pi->data = tmp;
}
}
}
}
//销毁
void destroyNodeList()
{
if(NULL == head)
{
return;
}
if(NULL == head->pNext)
{
free(head);
head = NULL;
return;
}
Node* p = head->pNext;
while(NULL != p)
{
Node* tmp = p;
p = p->pNext;
free(tmp);
}
free(head);
head = NULL;
}

void main()
{
createNodeList();

Node* node1 = (Node*)malloc(sizeof(Node));
node1->data = 1;
node1->pNext = NULL;

Node* node2 = (Node*)malloc(sizeof(Node));
node2->data = 2;
node2->pNext = NULL;

7. 数据结构(c语言描述)链表的倒叙输出

扣着的是头节点(头子)

车是首节点(首子)

马是次节点(次子)

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

根据步骤写程序的伪算法(3步4循环,7张图片搞定),如下:


第一个循环把马弄到车前面,

第二个循环把相弄到马前面

第三个循环把士弄到相前面

........

直到香指向为空后停止循环。

代码如下:只需要一个首结点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:香头跟着铁头

}

自己用道具操作几遍,然后把流程背会,以后自己根据流程写代码即可。

8. C语言链表逆序怎么理解

扣着的是头节点(头子)

车是首节点(首子)

马是次节点(次子)

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

根据步骤写程序的伪算法(3步4循环,7张图片搞定),如下:


第一个循环把马弄到车前面,

第二个循环把相弄到马前面

第三个循环把士弄到相前面

........

直到香指向为空后停止循环。

代码如下:只需要一个首结点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:香头跟着铁头

}

自己用道具操作几遍,然后把流程背会,以后自己根据流程写代码即可。

9. 求解C语言数据结构链表倒序思路

循环执行下列操作:

从旧链表头部抽走一个节点
再将这个节点压入新链表头部

旧链表:1--->2--->3--->4--->
新链表:

旧链表:2--->3--->4--->
新链表:1--->

旧链表:3--->4--->
新链表:2--->1--->

旧链表:4--->
新链表:3--->2--->1--->

旧链表:
新链表:4--->3--->2--->1--->

热点内容
安卓手机怎么加速进程 发布:2025-01-18 07:29:48 浏览:681
塞恩拐弯脚本 发布:2025-01-18 07:29:37 浏览:742
师资配置含哪些内容 发布:2025-01-18 07:17:35 浏览:706
江西脚本 发布:2025-01-18 07:14:38 浏览:392
php中i方法 发布:2025-01-18 07:13:19 浏览:369
FTP宝塔Linux面板 发布:2025-01-18 07:10:05 浏览:396
无线网卡怎么改密码 发布:2025-01-18 06:54:41 浏览:766
ava动态编译 发布:2025-01-18 06:54:39 浏览:765
中国学位论文全文数据库 发布:2025-01-18 06:43:49 浏览:689
全局变量存储类别 发布:2025-01-18 06:39:29 浏览:424