期末复习6--链表头插法(逆序)尾插法(顺序)---输出链表

2024-06-16 13:28

本文主要是介绍期末复习6--链表头插法(逆序)尾插法(顺序)---输出链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

头插法 

#include <stdio.h>
#include <stdlib.h>struct Node    //定义结构体
{char data;   //数据域struct Node * next;        //指针域
};/* 请在这里填写答案 */void PrintList (struct Node * head)
{struct Node * s;if(head == NULL){printf("None");return;}for(s=head;s!=NULL;s = s->next){printf("%c ",s->data);}
}int main()
{struct Node * head = NULL;head = CreateList(head);PrintList(head);return 0;
}

头插法的步骤

1.新节点 struct  Node* p;

2.新节点开空间  p=(struct Node*)malloc(sizeof(struct Node));

3.数据存储 p -> data = ch;

4.头插法重点顺序

p->next = head;

head=p;

5.切记要再scanf("%c",&ch);-------完整循环

struct Node* CreateList (struct Node * head)
{struct Node* p;char ch;scanf("%c",&ch);while(ch!='\n'){p=(struct Node *)malloc(sizeof(struct Node));p->data=ch;p->next=head;head=p;scanf("%c",&ch);}return head;
}

尾插法:

#include <stdio.h>
#include <stdlib.h>typedef struct Node {  // 定义结构体类型,并且用 typedef 简化声明char data;         // 数据域struct Node * next;// 指针域
} Node;// 尾插法创建链表
Node * createListTailInsertion() 
{Node *head, *temp, *newnode;char ch;head = NULL;scanf("%c", &ch); // 获取第一个字符while (ch != '\n') {newnode = (Node*) malloc(sizeof(Node)); // 创建新节点newnode->data = ch;                      // 赋值给新节点的数据域newnode->next = NULL;                    // 设置新节点的下一个为nullif (head == NULL)                        // 如果是第一个节点,则设置头指针指向新节点head = temp = newnode;else                                     // 否则将新节点添加到链表末尾{temp->next = newnode;                // 将最后一个节点的指针域指向新节点temp = newnode;                      // 更新最后一个节点指针}scanf("%c", &ch);                        // 获取下一个字符}return head;                                // 返回链表头
}// 打印链表
void printList(Node * head)
{Node * s;if(head == NULL){printf("None\n");return;}for(s=head;s!=NULL;s = s->next){printf("%c ",s->data);}printf("\n");                               // 输出换行符以使输出更清晰
}int main()
{Node * head = NULL;head = createListTailInsertion();           // 使用尾插法创建链表printList(head);                            // 打印链表return 0;
}

 尾插法步骤:

1.比头插法多一个尾结点*tail;

struct Node* head,* tail, * p;

2.头插尾插都需要 char ch;----表示数据

3.scanf("%c",&ch)

4.新指针节点开空间 p = (struct Node*)malloc(sizeof(struct Node))

5.存储数据   p->data = ch;

                   p->next = NULL;

6.头指针的可能性

head ==NULL-------- head = tail = p; // 头指针是第一个节点,设置头指针指向新节点

head != NULL--------tail -> next = p; tail = p;

7.切记 scanf ("%c",&ch);

返回head;

输出链表:

for (head; head!=NULL; head=head->next)

{

printf("%c",head->data);

}

总结注意易错点:

1.while循环里一定要写成 ch!='\n'循环后面一定要加上 scanf("%c",&ch);---更新数据

不要写成scanf("%c",&ch)!=EOF

否则就不会输出第一个字母

2.头插法和尾插法非常重要的记忆方法:

头插法开始只是struct *head,*p;-------尾插法struct *head,*tail,*p;

头插法开始head=NULL ---------- 尾插法 head = tail =NULL;

头插法循环里  if (head==NULL) ----head = p;

                       else { p->next = head;

                                  head=p;---更新头结点}

尾插法循环里  if(head==NULL)-------head=tail=p;

                        else{ tail->next = p;

                                tail=p;--更新尾结点}

Node * createListTailInsertion() 
{struct Node*head,*p;char ch;scanf("%c",&ch);head=NULL;while(ch!='\n')//while(scanf("%c",&ch)!=EOF)// while(1){//if(scanf("%c",&ch)!=1||ch=='\n')break;p=(struct Node*)malloc(sizeof(struct Node));p->data=ch;p->next=NULL;if(head==NULL)  head=p;else{p->next = head;head=p;}scanf("%c",&ch);}return head;
}

这篇关于期末复习6--链表头插法(逆序)尾插法(顺序)---输出链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066580

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename