链表基本操作的实现(转)

链表基本操作的实现

  1 #include <stdio.h>
  2 #include <malloc.h>
  3 #define LEN sizeof(struct student)
  4
  5 /*----------------数据定义----------------------*/
  6
  7 //定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针
  8 struct student
  9 {
 10     long num;                //学号
 11     char name[128];            //姓名
 12     struct student *next;    //结构体指针
 13 };
 14
 15 typedef struct student * stuNode;
 16
 17 int n=0;                    //全局变量,记录链表的长度
 18
 19 /*---------------函数声明---------------------*/
 20
 21 stuNode Create();            //创建一个新的链表
 22
 23 void Print(stuNode head);    //通过传入的链表头指针打印整个链表
 24
 25 stuNode Delete(stuNode head,int num);    //通过传入的链表头指针和学生学号删除节点
 26
 27 stuNode Insert(stuNode head,stuNode newStu);    //依照学生学号的顺序向链表中插入新元素
 28
 29
 30 /*---------------函数定义----------------------*/
 31
 32 struct student *Create()
 33 {
 34     struct student *head,*p1,*p2;
 35
 36     //开辟一个LEN大小的空间,并让p1,p2指针指向它
 37     p2=p1=(struct student *)malloc(LEN);
 38     //将头指针置为NULL
 39     head=NULL;
 40
 41     //创建链表节点并给节点的元素赋值
 42     printf("请输入学生的学号和姓名:");
 43     scanf("%ld %s",&p1->num,p1->name);
 44     while(p1->num!=0)
 45     {
 46         n=n+1;
 47         if(NULL==head)
 48         {
 49             head=p1;
 50         }
 51         else
 52         {
 53             p2->next=p1;
 54         }
 55         p2=p1;
 56         p1=(struct student *)malloc(LEN);
 57         printf("请输入学生的学号和姓名:");
 58         scanf("%ld %s",&p1->num,p1->name);
 59     }
 60     //将尾节点的指针置为NULL
 61     p2->next=NULL;
 62     return head;
 63 }
 64
 65
 66 void Print(struct student *head)
 67 {
 68     struct student * p;
 69     p=head;
 70
 71     //判断链表是否为空
 72     if(NULL==head)
 73     {
 74         printf("链表为空!\n");
 75         return head;
 76     }
 77     else
 78     {
 79         //循环打印链表中的元素
 80         printf("%d 个记录分别为:\n",n);
 81         while(p!=NULL)
 82         {
 83             printf("%ld %s\n",p->num,p->name);
 84             //指针指向下一个节点
 85             p=p->next;
 86         }
 87     }
 88 }
 89
 90
 91 struct student *Delete(struct student * head,int num)
 92 {
 93     struct student *p1;
 94     struct student *p2;
 95     p1=head;
 96     //判断链表是否为空
 97     if(NULL==head)
 98     {
 99         printf("链表为空!\n");
100         return head;
101     }
102     //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点
103     //如果找到相应节点,或者已经遍历到尾节点就跳出循环
104     while(p1->num!=num&&p1->next!=NULL)
105     {
106         p2=p1;
107         p1=p1->next;
108     }
109     //判断是否找到相应节点
110     if(p1->num==num)
111     {
112         //要删除的节点是不是链表的第一个节点
113         //如果是,就将头指针指向该节点的后一个节点
114         //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点
115         if(head==p1)
116         {
117             head=p1->next;
118         }
119         else
120         {
121             p2->next=p1->next;
122         }
123         n=n-1;
124         printf("%ld 节点已删除.\n",num);
125     }
126     else
127     {
128         printf("链表中没有要删除的元素.\n");
129     }
130     return head;
131 }
132
133
134 struct student *Insert(struct student * head,struct student * newStu)
135 {
136     struct student *p0;
137     struct student *p1;
138     struct student *p2;
139     p0=newStu;
140     p1=head;
141     //判断链表是否为空,如果是空链表,就将新节点作为第一个节点
142     if(NULL==head)
143     {
144         head=p0;
145         p0->next=NULL;
146     }
147     else
148     {
149         //遍历每一个节点中的学号,与新学号比较大小
150         //如果找到一个学号比新学号大,就将新学号的节点插入它之前
151         //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部
152         while((p0->num > p1->num)&&(p1->next!=NULL))
153         {
154             p2=p1;
155             p1=p1->next;
156         }
157         //找到一个比新学号大的节点
158         if(p0->num <= p1->num)
159         {
160             //判断该节点是否为头节点,如果是,则将新节点设置为头节点
161             if(p1==head)
162             {
163                 head=p0;
164             }
165             else
166             {
167                 p2->next=p0;
168             }
169               p0->next=p1;
170         }
171         else
172         {
173             p1->next=p0;
174             p0->next=NULL;
175         }
176     }
177     //链表长度加1
178     n=n+1;
179     printf("%ld 插入成功!\n",newStu->num);
180     return head;
181 }
182
183 void main()
184 {
185     struct student *head;
186     struct student *stu;
187     int num;
188     head=Create();
189     Print(head);
190     printf("请输入要删除的学号:");
191     scanf("%ld",&num);
192     while(num!=0)
193     {
194         head=Delete(head,num);
195         Print(head);
196         printf("请输入要删除的学号:");
197         scanf("%ld",&num);
198     }
199     printf("请输入要插入的节点:");
200     stu=(struct student *)malloc(LEN);
201     scanf("%ld %s",&stu->num,stu->name);
202     while(stu->num!=0)
203     {
204         head=Insert(head,stu);
205         printf("请输入要插入的节点:");
206         stu=(struct student *)malloc(LEN);
207         scanf("%ld %s",&stu->num,stu->name);
208     }
209     Print(head);
210 }

mingw5编译通过,链表结构是数据结构中的基础,掌握链表的逻辑,存储结构和基本操作,并能自己用代码实现,将有助于对后续复杂数据结构和算法的学习!

时间: 2024-10-18 11:20:14

链表基本操作的实现(转)的相关文章

链表基本操作集合

链表基本操作集合 //List code by Denis #include <stdio.h> #include <malloc.h> #define ture 1 #define false 0 typedef int ElemType; typedef struct list{ ElemType data; struct list *next; }LNode; //Create a list,nLength is the length of the line list LNo

数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表.单链表基本操作的实现   l  实验目的 1.顺序表 (1)掌握线性表的基本运算. (2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作. (3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力. l  实验内容 1. 顺序表 1.编写线性表基本操作函数: (1)InitList(LIST *L,int ms)初始化线性表: (2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素: (3)DeleteList1

c++学习笔记—单链表基本操作的实现

用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: [cpp] view plaincopy #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct Lnode { int data; struct 

Java链表基本操作和Java.util.ArrayList

Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题"从尾到头打印链表",具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 一开始我想的是通过两次遍历链表,第一次遍历得到链表元素的个数count.然后定义一个ArrayList 变量,由于ArrayList是动态数组,不能在未初始化的情况下对任意位置进行插入指定的值.所以只能先对其进行初始化,将count个ArrayList元素赋值为初始值0

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释

数据结构学习之双链表基本操作

数据结构学习之双链表基本操作 0x1 前言 今天实验课,学习了下双链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的双链链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)

数据结构复习--java实现单链表基本操作

单链表的基本操作包括建立单链表.查找运算(按序查找和按值查找).插入运算(前插和后插)和删除运算.下面给出具体的java实现程序: package com.zpp.test; //首先创建一个节点类 public class Node { private Node next; //指针域 private int data;//数据域 public Node( int data) { this. data = data; } } package com.zpp.test; public class

利用线性链表基本操作完成两个有序线性表的合并

La.Lb线性链表升序排列,将结果放在Lc链表里.之前有文章写过两个有序链表的合并 区别在于,前面的做法是保留La的头节点,free掉Lb的头节点,将余下节点串起来.这种方法是面向过程编程 而现在讨论的做法,是单独建立一个Lc链表,利用一些已经写好的基本操作函数来完成,这种模块化编程做法实际上还简单些.不光模块函数里写不了几行,在调用这些函数时减少了不必要的琐碎过程的思考时间. 该做法的核心思想:将每轮比较过后偏小的那个节点从相应链表中删除(这是头节点的指针不会指向该节点了,但该节点的空间依旧保

链表 基本操作

实验目的 1. 定义单链表的结点类型. 2. 熟悉对单链表的一些基本操作和具体的函数定义. 3. 通过单链表的定义掌握线性表的链式存储结构的特点. 4. 掌握循环链表和双链表的定义和构造方法. 实验内容 该程序的功能是实现单链表的定义和操作.该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数.程序中的单链表(带头结点)结点为结构类型,结点值为整型. /* 定义DataType为int类型 */ typedef int DataType; /* 单链表的结点类型 */ typedef