链表的基础操作专题小归纳

后天就要程序设计考试了,今晚抓紧复习链表ing!

这次就来总结一下链表的六大基础操作:

(1)创建链表

(2)遍历链表

(3)在链表中检索

(4)向链表中插入一项

(5)从链表中删除一项

(6)交换链表中两项的位置

全部都放在一个代码里了,这样好操作一点 /笑哭

至于链表的引申操作,什么头插法尾插法的,都是这六大基础操作之外的事情,有兴趣的话烦请各位自己去了解啦,我这里就不介绍了~

注释都非常详细,我是真的没有啥时间画图做解释了,将就着看吧~

(毕竟我个人也不喜欢一上来啥也不说就版代码的,那会让我很暴躁)

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 const int SIZE = 5;//5个学生信息节点作为测试样例
  5 typedef struct student
  6 {
  7     int number;//学号
  8     char name[30];//姓名
  9     int score;//成绩
 10     struct student* next;//指向下一节点的指针
 11 }student;
 12
 13 student* input(student* stu)//操作①:创建链表
 14 {
 15     int i;
 16     student* p;//将要插入的新节点
 17     student* q;//一个引子
 18     printf("请输入学生的学号,姓名,成绩(以空格分隔):\n");
 19     q = stu;//q初始指向表头
 20     for (i = 0; i < SIZE; i++)
 21     {
 22         p = (student*)malloc(sizeof(student));//为即将插入的信息节点申请空间
 23         scanf("%d %s %d", &p->number, p->name, &p->score);
 24         p->next = q->next;//保证q->next一定是NULL,排除指向空的情况
 25         q->next = p;
 26         q = q->next;
 27     }
 28     return stu;
 29 }
 30
 31 void output(student* stu)//操作②:从头遍历链表(并输出)
 32 {
 33     student* p = stu->next;
 34     while (p != NULL)
 35     {
 36         printf("%d %s %d\n", p->number, p->name, p->score);
 37         p = p->next;
 38     }
 39 }
 40
 41 student* check(student* stu)//操作③:在链表中检索某个节点,并带回主函数输出(在这里我以找到第一个成绩为66的学生信息,带回主函数输出为例)
 42 {
 43     student* p = stu->next;
 44     while (p != NULL)
 45     {
 46         if (p->score == 66)
 47         {
 48             return p;//找到了返回指针p
 49         }
 50         else
 51         {
 52             p = p->next;//否则继续往下找
 53         }
 54     }
 55     return p;
 56 }
 57
 58 student* insert_s(student* stu, student* temp)//操作④:在链表中插入一个节点temp,并带回主函数输出
 59 {
 60     int flag = 1;//不能写成2,那样会找到第三节点,想想为什么?
 61     student* p = stu->next;
 62     while (flag)//找到第二节点,并用指针p指向
 63     {
 64         p = p->next;
 65         flag--;
 66     }
 67     temp->next = p->next;
 68     p->next = temp;//注意:此行和上一行不能调换,否则会导致节点丢失!
 69     return stu;
 70 }
 71
 72 student* del(student* stu)//操作⑤:删除链表中的某个节点,并带回主函数,输出
 73 {
 74     int flag = 1;
 75     student* p = stu->next;
 76     student* q;//q是要删除的那一个节点(在本题中指第三节点)
 77     while (flag)//找到第二节点,并用指针p指向
 78     {
 79         p = p->next;
 80         flag--;
 81     }
 82     q = p->next;
 83     q = q->next;
 84     free(p->next);//释放指针
 85     p->next = q;
 86     return stu;
 87 }
 88
 89 student* exchange(student* stu)
 90 {
 91     int flag1 = 1;//第二节点
 92     int flag2 = 4;//第五节点
 93     int flag11 = flag1-1;//第二节点前驱节点
 94     int flag22 = flag2-1;//第五节点前驱节点
 95     student* p = stu->next;//前方节点(在本题中指第二节点)
 96     student* q = stu->next;//后方节点(在本题中指第五节点)
 97     student* pp = stu->next;//前方节点的前驱节点(在本题中指第一节点)
 98     student* qq = stu->next;//后方节点的前驱节点(在本题中指第四节点)
 99     student* temp;//中介变量
100     while (flag1)//定位节点p
101     {
102         p = p->next;
103         flag1--;
104     }
105     while (flag2)//定位节点q
106     {
107         q = q->next;
108         flag2--;
109     }
110     while (flag11)//定位节点pp
111     {
112         pp = pp->next;
113         flag11--;
114     }
115     while (flag22)//定位节点qq
116     {
117         qq = qq->next;
118         flag22--;
119     }
120     /*=================*///交换p->next和q->next
121     temp = p->next;
122     p->next = q->next;
123     q->next = temp;
124     /*=================*///交换pp->next和qq->next
125     pp->next = q;
126     qq->next = p;
127     /*=================*///交换p和q
128     p = pp->next;
129     q = qq->next;
130     /*=================*/
131     return stu;
132 }
133
134 int main()
135 {
136     student* stu;//定义表头指针
137     student* s;//中介指针1
138     student* ss;//中介指针2
139     student* temp;
140     /*======================================================*///建立表头
141     stu = (student*)malloc(sizeof(student));//为表头节点分配空间
142     stu->next = NULL;
143     /*======================================================*/
144     //操作①:建立单链表,并用s指向
145     s = input(stu);
146
147     //操作②:输出这个链表
148     printf("\n");
149     output(s);
150
151     //操作③:在链表中检索某个节点,并用s指向
152     ss = check(s);
153     printf("\n%d %s %d\n", ss->number, ss->name, ss->score);//输出特定节点的所有信息
154
155     //操作④:在建立好的链表第二三节点间插入节点temp,并输出检验
156     temp = (student*)malloc(sizeof(student));
157     scanf("%d %s %d", &temp->number, temp->name, &temp->score);
158     ss = insert_s(s, temp);
159     printf("\n");
160     output(ss);
161
162     //操作⑤:删除已经建立好的链表中的第三节点,并输出检验
163     ss = del(s);
164     printf("\n");
165     output(ss);
166
167     //操作⑥:交换建立好的链表中的第二和第五节点,并输出检验
168     ss = exchange(s);
169     printf("\n");
170     output(ss);
171     return 0;
172 }

原文地址:https://www.cnblogs.com/geek-007/p/12112838.html

时间: 2024-08-29 15:02:08

链表的基础操作专题小归纳的相关文章

单链表的基础操作

单链表中节点的查找.插入.删除.求单链表长度等操作. 按序号查找结点值 在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL. 按序号查找结点值的算法如下: LNode GetElem(LinkList L,int i){ //本算法取出单链表L(带头结点)中第i个位置的结点指针 int j=1; //计数,初始为1 LNode *p = L->next; //头结点指针赋给p if(i==0) return L; //若i等于0,

单链表基础操作的Java实现

链表是很多的数据结构的基础,比如说:队列,栈,二叉树,优先级队列等等,而链表也是很多公司面试和笔试的常考题. 链表的基本操作包括:判断是否为空,头部插入,尾部插入,根据key值查找,根据key值删除,遍历链表. 当然稍微复杂一点的操作还包括:链表的逆序,链表的排序等等. 在链表中,包含两个类:Node(节点) package com.qiao.lb; public class Node { public long data; public Node next; public Node(long

DOS基础使用专题(强烈推荐)

DOS基础使用专题(强烈推荐) 美丽的DOS时代 DOS是世界上使用人数最多的操作系统,包括上面的Win3.x/9x等GUI操作平台的用户.尽管许多人由于种种原因而使用了其它非DOS的操作系统或操作环境,如Windows  NT/2K/XP等,但是,由于DOS确实非常方便实用,操作起来效率非常高.简单快捷,而且功能也非常强大,从文件和磁盘操作到网络和多媒体操作等样样都能方便的做到,而且能做到许多在其它系统或环境下做不到或做不好的事情,所以它深受人们的喜爱.直到现在,它一直被人们广泛使用并得到不断

双向链表的基础操作(C++实现)

★C++实现双向链表的基础操作(类的实现) #include<iostream> #include<cassert> using namespace std; typedef int DataType; class double_link_list {                        //定义双向链表类,包括了双向的前驱和后继指针,以及对象的初始化 public: friend class ListNode; double_link_list(DataType x =

数据结构-线性表的一些基础操作 c++代码

//线性表的顺序存储结构 template <class T> class Linearlist { public: Linearlist(int MaxListSize == 10); ~Linearlist() { delete []element; } bool IsEmpty() const { return length == 0; } bool IsFull() const { return length == MaxSize; } int Length() const { ret

Mac下Git的基础操作

目前最火的版本控制软件是Git了吧,今天简单梳理一下Mac下Git的基础操作~~ 一.什么是Git Git是一个分布式代码管理工具,用于敏捷的处理或大或小的项目,类似的工具还有svn. 基于Git的快速的.免费的.稳定的在线代码托管平台有github,还有一些国内的,coding.csdn代码托管平台.京东代码托管平台等等. 二.Git的基本使用 1.注册一个git账号 咱们以coding代码托管平台为例来简单介绍 A.登陆coding网站https://coding.net/,注册coding

链表的基础题目学习(EPI)

链表的题目总体来说细节比较多,因为链表的题目在操作链表的过程中本身有些复杂,所以如果链表作为编程题出现的时候,多数情况下题目本身的思路可能不是很复杂,不要把题目往复杂的方向去思考就好了~这里的链表只是说单向链表,双向链表,跳表.树的链表表示形式不属于这个链表的范畴. 1.合并两个有序的链表.额外空间要求O(1). 思路很明确的一个题目,三个指针. 2.如何判断一个链表中是否存在环?如果存在环,如何快速的找出环的起点位置. 这个题目只要见过一次就很难再忘记它的解题方法了,非常有技巧的一个方法.fa

[Android] SQLite数据库之增删改查基础操作

    在编程中常常会遇到数据库的操作,而Android系统内置了SQLite,它是一款轻型数据库,遵守事务ACID的关系型数据库管理系统,它占用的资源非常低,可以支持Windows/Linux/Unix等主流操作系统,同一时候可以跟非常多程序语言如C#.PHP.Java等相结合.以下先回想SQL的基本语句,再讲述Android的基本操作. 一. adb shell回想SQL语句     首先,我感觉自己整个大学印象最深的几门课就包含<数据库>,所以想先回想SQL增删改查的基本语句.而在And

Linux入门及基础操作

Linux入门及基础操作 5. 用户登录  用户大体分为两种,普通用户和root用户,区别在于:root用户是一个特殊的管理帐户,也被称为超级用户,root已近完整的系统控制,对系统损害几乎有无限的能力,要注意的是:除非必要,为 不要登录为 root.而普通用户相对权限较小,对系统的破坏程度有限. 登陆进去后,会显示图形界面,从而引入了一个概念,终端. 在图形界面下,使用Ctrl+Alt+F[1-6],切换伪终端.切换后需要登录用户名和密码,便可以在字符界面登录. 博主解析:图中的登录界面和图形