链表 基本操作

实验目的

1.  定义单链表的结点类型。

2.  熟悉对单链表的一些基本操作和具体的函数定义。

3.  通过单链表的定义掌握线性表的链式存储结构的特点。

4.  掌握循环链表和双链表的定义和构造方法。

实验内容

该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。

/* 定义DataType为int类型 */

typedef int DataType;

/* 单链表的结点类型 */

typedef struct LNode

{DataType data;

     struct LNode *next;

}LNode,*LinkedList;

/* 初始化单链表 */

LinkedList LinkedListInit()

/* 清空单链表 */

void LinkedListClear(LinkedList L)

/* 检查单链表是否为空 */

int LinkedListEmpty(LinkedList L)

/* 遍历单链表 */

void LinkedListTraverse(LinkedList L)

/* 求单链表的长度 */

int  LinkedListLength(LinkedList L)

/* 从单链表表中查找元素 */

LinkedList  LinkedListGet(LinkedList L,int  i)

/* 从单链表表中查找与给定元素值相同的元素在链表中的位置 */

LinkedList  LinkedListLocate(LinkedList  L, DataType  x)

/* 向单链表中插入元素 */

void  LinkedListInsert(LinkedList L,int i,DataType  x)

/* 从单链表中删除元素 */

void LinkedListDel(LinkedList  L,DataType x)

/* 用尾插法建立单链表 */

LinkedList  LinkedListCreat( )
  1 #include <stdio.h>
  2 #include <malloc.h>
  3 #include <stdlib.h>
  4
  5 /* 定义DataType为int类型 */
  6 typedef int DataType;
  7
  8 /* 单链表的结点类型 */
  9 typedef struct LNode{
 10     DataType data;
 11     struct LNode *next;
 12 }LNode,*LinkedList;
 13
 14 /* 1. 初始化单链表 */
 15 LinkedList LinkedListInit()
 16 {
 17     LinkedList head = (LNode*)malloc(sizeof(LNode));
 18     head->next = NULL;
 19     return head;
 20 }
 21
 22 /* 2. 清空单链表 */
 23 void LinkedListClear(LinkedList L)
 24 {
 25     //L为头指针
 26     while(L->next!=NULL){    //依次清空节点,直到头指针指向的下一个节点的地址为空
 27         LinkedList t;
 28         t = L->next;
 29         L->next = t->next;
 30         free(t);
 31     }
 32     return ;
 33 }
 34
 35 /* 3. 检查单链表是否为空 */
 36 int LinkedListEmpty(LinkedList L)
 37 {
 38     if(L->next==NULL)    //头指针指向的下一个节点地址为空,说明链表为空。否则不为空。
 39         return 1;
 40     else
 41         return 0;
 42 }
 43
 44 /* 4. 遍历单链表 */
 45 void LinkedListTraverse(LinkedList L)
 46 {
 47     LinkedList p = L->next;
 48     while(p){
 49         printf("%d ",p->data);    //遍历输出节点
 50         p = p->next;
 51     }
 52     printf("\n");
 53     return ;
 54 }
 55
 56 /* 5. 求单链表的长度 */
 57 int  LinkedListLength(LinkedList L)
 58 {
 59     LinkedList p = L->next;
 60     int len=0;
 61     while(p){
 62         len++;    //遍历一个节点长度+1
 63         p = p->next;
 64     }
 65     return len;
 66 }
 67
 68 /* 6. 从单链表表中查找元素 */
 69 LinkedList  LinkedListGet(LinkedList L,int  i)
 70 {
 71     int j=1;
 72     LinkedList p = L->next;
 73     while(p){
 74         if(j==i)
 75             return p;
 76         p = p->next;
 77         j++;    //遍历一个节点长度+1
 78     }
 79     return NULL;
 80 }
 81
 82 /* 7. 从单链表表中查找与给定元素值相同的元素在链表中的位置 */
 83 int LinkedListLocate(LinkedList  L, DataType  x)
 84 {
 85     int i=1;
 86     LinkedList p = L->next;
 87     while(p){
 88         if(p->data==x)
 89             return i;
 90         p = p->next;
 91         i++;
 92     }
 93     return 0;
 94 }
 95
 96 /* 8. 向单链表中插入元素 */
 97 void  LinkedListInsert(LinkedList L,int i,DataType  x)
 98 {
 99     int j=1;
100     LinkedList p = L->next;
101     while(p && j!=i-1){    //找到i的前一个元素
102         p = p->next;
103         j++;    //遍历一个节点+1
104     }
105     //找到位置
106     if(j==i-1){
107         LinkedList q = (LinkedList)malloc(sizeof(LNode));
108         q->data = x;
109         q->next = p->next;
110         p->next = q;
111     }
112     return ;
113 }
114
115 /* 9. 从单链表中删除元素 */
116 void LinkedListDel(LinkedList  L,DataType x)
117 {
118     LinkedList p = L->next;
119     while(p->next->data!=x){    //找到值为x的前一个元素
120         p = p->next;
121     }
122     //找到位置
123     if(p->next->data==x){
124         LinkedList q = p->next;
125         p->next = q->next;
126         free(q);
127     }
128     return ;
129 }
130
131 /* 10. 用尾插法建立单链表 */
132 LinkedList  LinkedListCreat( LinkedList L,DataType a[],int n )    //讲数组a中的元素以尾插法放入链表中
133 {
134     LinkedList p = L;
135     int i;
136     for(i=1;i<=n;i++){
137         LinkedList q = (LinkedList)malloc(sizeof(LNode));
138         q->data = a[i];
139         q->next = NULL;
140         p->next = q;
141         p = q;
142     }
143     return L;
144 }
145
146 int Menu()
147 {
148     int in;
149     printf("[0] 请先初始化一个链表\n");
150     printf("[1] 用尾插法建立单链表\n");
151     printf("[2] 检查单链表是否为空\n");
152     printf("[3] 遍历单链表\n");
153     printf("[4] 求单链表的长度\n");
154     printf("[5] 从单链表表中查找元素\n");
155     printf("[6] 从单链表表中查找与给定元素值相同的元素在链表中的位置\n");
156     printf("[7] 向单链表中插入元素\n");
157     printf("[8] 从单链表中删除元素\n");
158     printf("[9] 清空单链表\n");
159     printf("[10] 按其他键退出\n");
160     scanf("%d",&in);
161     return in;
162 }
163 LinkedList Reply(LinkedList head,int in)
164 {
165     int i,n;
166     switch(in){
167         case 0:    //初始化一个链表
168             head = LinkedListInit();
169             printf("初始化成功!\n");
170             break;
171
172         case 1:    //用尾插法建立单链表
173             int a[1001];
174             printf("请问你要输入多少个数据?:(最多1000个)\n");
175             scanf("%d",&n);    //输入链表大小
176             printf("请依次输入数据:\n");
177             for(i=1;i<=n;i++)
178                 scanf("%d",&a[i]);
179             head = LinkedListCreat(head,a,n);
180             printf("链表建立成功!\n");
181             break;
182
183         case 2:    //检查单链表是否为空
184             if(LinkedListEmpty(head))
185                 printf("链表为空\n");
186             else
187                 printf("链表不为空\n");
188             break;
189
190         case 3:    //遍历单链表
191             LinkedListTraverse(head);
192             break;
193
194         case 4:    //求单链表的长度
195             printf("链表长度为:%d\n",LinkedListLength(head));
196             break;
197
198         case 5:    //从单链表中查找元素
199             printf("你要查找链表中第几个元素值?\n");
200             scanf("%d",&n);
201             LinkedList p;
202             p = LinkedListGet(head,n);
203             printf("第%d个元素值是:%d\n",n,p->data);
204             break;
205
206         case 6:    //从单链表表中查找与给定元素值相同的元素在链表中的位置
207             printf("你要查找的元素值是?\n");
208             scanf("%d",&n);
209             printf("它是第%d个元素\n",LinkedListLocate(head,n));
210             break;
211
212         case 7:    //向单链表中插入元素
213             printf("请问你要在第几个元素的位置插入?\n");
214             scanf("%d",&i);
215             printf("请问你要插入的元素值为多少?\n");
216             scanf("%d",&n);
217             LinkedListInsert(head,i,n);
218             printf("插入成功!\n");
219             printf("插入之后的链表结构为:\n");
220             LinkedListTraverse(head);
221             break;
222
223         case 8:    //从单链表中删除元素
224             printf("请问你要删除值为多少的元素?\n");
225             scanf("%d",&n);
226             LinkedListDel(head,n);
227             printf("删除成功!\n");
228             printf("删除之后的链表结构为:\n");
229             LinkedListTraverse(head);
230             break;
231
232         case 9:    //清空单链表
233             LinkedListClear(head);
234             printf("清空成功!\n");
235             break;
236
237         default:
238             printf("Bye~\n");
239             exit(1);
240     }
241     return head;
242 }
243 int main()
244 {
245     int in;    //存储输入命令
246     LinkedList head;
247     while(1){
248         in = Menu();
249         head = Reply(head,in);    //响应命令
250         printf("\n");
251         system("pause");
252         system("cls");
253     }
254     return 0;
255 }
时间: 2024-10-06 13:03:55

链表 基本操作的相关文章

链表基本操作集合

链表基本操作集合 //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 

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

链表基本操作的实现 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

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链表,利用一些已经写好的基本操作函数来完成,这种模块化编程做法实际上还简单些.不光模块函数里写不了几行,在调用这些函数时减少了不必要的琐碎过程的思考时间. 该做法的核心思想:将每轮比较过后偏小的那个节点从相应链表中删除(这是头节点的指针不会指向该节点了,但该节点的空间依旧保