数据结构之单链表基本操作 C语言

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define OK            0
  4 #define ERROR        -1
  5
  6 //
  7 typedef int Status;
  8 typedef int ElemType;
  9
 10 /*
 11 单链表的存储结构:
 12 使用typedef定义的后面的LNode和*LinkList分别表示的是
 13 LNode是一个结构体类型的可以用他定义其他变量例如 LNode node即 node也为LNode类型的结构体
 14 *LinkList是一个结构体类型的指针可以用他定义其他变量例如 *LinkList node即 node也为LNode类型的结构体指针
 15 */
 16 typedef struct LNode{
 17     ElemType data; //数据域
 18     struct LNode *next; //指针域
 19 }LNode,*LinkList;
 20
 21 int main(){
 22     ElemType data1[]={1,2,3,4,5,6,7,8,9};
 23     int n=9;
 24     //声明创建链表的方法
 25     //头插法
 26     LinkList Create_Link_Tou(ElemType data1[],int n);
 27     //尾插法
 28     LinkList Create_Link_Wei(ElemType data1[],int n);
 29     //获取第i个元素
 30     Status GetElem(LinkList L,int i);
 31     //在第i个元素之前插入元素
 32     LinkList ListInsert_L(LinkList L,int i);
 33     //删除链表中的第i个元素
 34     LinkList ListDelete_L(LinkList L,int i);
 35     //声明展示链表的方法
 36     void DisPlay(LinkList L);
 37     //循环调用Create_Link方法为链表赋值
 38     LinkList head=Create_Link_Wei(data1,n);
 39     //展示链表的方法
 40     printf("原始列表的数据为:");
 41     DisPlay(head);
 42     printf("插入后的列表的数据为:");
 43     head=ListInsert_L(head,4);
 44     DisPlay(head);
 45     head=ListDelete_L(head,3);
 46     printf("删除后的列表的数据为:");
 47     DisPlay(head);
 48     GetElem(head,5);
 49     return 0;
 50 }
 51
 52 #if(0)
 53 //头插法创建单链表
 54 //创建链表的方法 传入的参数为链表的指针(头结点)和数据域
 55 LinkList Create_Link_Tou(ElemType data1[],int n){
 56     //给头结点分配空间
 57     LinkList head_node=(LinkList)malloc(sizeof(LNode));
 58     if(head_node==NULL){
 59         return ERROR;
 60     }
 61     head_node->next=NULL;
 62     int i;
 63     for (i =0; i <n; i++){
 64         //给链表分配内存
 65         LinkList p=(LinkList)malloc(sizeof(LNode));
 66         //进行赋值操作
 67         p->data=data1[i];
 68         p->next=head_node->next;
 69         head_node->next=p;
 70     }
 71     return head_node;
 72 }
 73 #endif
 74
 75 #if(1)
 76 //尾插法创建单链表
 77 LinkList Create_Link_Wei(ElemType data1[],int n){
 78     //给头结点分配空间
 79     LinkList head_node=(LinkList)malloc(sizeof(LNode));
 80     if(head_node==NULL){
 81         return ERROR;
 82     }
 83     //首先将头结点的下一个指针为空
 84     head_node->next=NULL;
 85     //定义尾结点
 86     LinkList rear;
 87     //开始尾结点指向头结点
 88     rear=head_node;
 89     int i;
 90     for (i =0; i <n; i++){
 91         //给链表分配内存
 92         LinkList p=(LinkList)malloc(sizeof(LNode));
 93         //进行赋值操作
 94         p->data=data1[i];
 95         rear->next=p;
 96         rear=p;
 97     }
 98     //最后将尾结点的next为空 防止出现死循环
 99     rear->next=NULL;
100     return head_node;
101 }
102 #endif
103
104 //展示链表的方法 传入的参数为链表的指针
105 void DisPlay(LinkList L){
106     if (L == NULL){
107         return;
108     }
109     // 链表第一个结点指针
110     LinkList temp = L->next;
111     while (temp!=NULL){
112         printf ("%4d", temp->data);
113         temp = temp->next;
114     }
115     printf ("\n");
116 }
117
118
119 #if(1)
120 //获取链表中的第i个元素
121 Status GetElem(LinkList L,int i){
122     //创建一个ElemType类型的变量用来接收值
123     ElemType e;
124     //创建一个链表的指针变量
125     LinkList p;
126     //p指向头结点的下一个节点,头结点为传入的参数
127     p=L->next;
128     int j=1;
129     while(p!=NULL&&j<i){
130         p=p->next;
131         ++j;
132     }
133     //如果为空返回错误
134     if(p==NULL||j>i){
135         return ERROR;
136     }
137     e=p->data;
138     printf("第%d个元素是%d\n",i,e);
139     return OK;
140 }
141 #endif
142
143 #if(1)
144 //向单链表中插入元素的方法 在第i个元素之前插入元素e
145 LinkList ListInsert_L(LinkList L,int i){
146     ElemType e=20; //要插入的元素
147     LinkList p; //创建一个链表指针
148     int j=0;//创建一个变量
149     p=L;//将头结点赋值给指针p
150     //找到i之前的节点
151     while(p!=NULL&&j<i-1){
152         p=p->next;
153         ++j;
154     }
155     if(p==NULL||j>i-1){
156         return ERROR;
157     }
158     //创建一个新节点
159     LinkList s=(LinkList)malloc(sizeof(LNode));
160     //进行数据的赋值和指针的转换
161     s->data=e;
162     s->next=p->next;
163     p->next=s;
164     //返回头结点
165     return L;
166 }
167 #endif
168
169 #if(1)
170 //删除链表中的第i个元素
171 LinkList ListDelete_L(LinkList L,int i){
172     int e,j=0;
173     LinkList p,q;
174     p=L;
175     //循环找到第i个元素
176     while(p->next!=NULL&&j<i-1){
177         p=p->next;
178         ++j;
179     }
180     //错误判断
181     if(p->next==NULL||j>i-1){
182         return ERROR;
183     }
184     //转换指针 删除节点
185     q=p->next;
186     p->next=q->next;
187     e=q->data;
188     printf("删除的%d元素为:%d\n",i,e);
189     return L;
190 }
191 #endif

运行结果:=========================================================================================================================================

原文地址:https://www.cnblogs.com/yh2924/p/12501723.html

时间: 2024-11-25 18:56:39

数据结构之单链表基本操作 C语言的相关文章

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

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

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

数据结构学习之单链表基本操作 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)释

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

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

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

C#数据结构-单链表

理论基础: 链表是用一组任意的存储单元来存储线性表中的数据元素. 如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List). 单链表由头引用H唯一确定.头引用指向单链表的第一个结点,也就是把单链表第一个结点的地址放在H中. C#实现: 1接口 引用线性表的接口IListDS<T> 2实现 首先,必须定义一个单链表的节点类.  1 public class Node<T> 2    { 3        private T data

单链表反转C语言实现

单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: # include <iostream> # include <cstdlib> using namespace std; struct linkNode { int val; linkNode *next; linkNode(int x):val(x),next(NULL){} }; linkNod

数据结构复习--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

单链表(C语言)基本操作

单链表:单向有序链表 最后置于空 #pragma once #include<string.h> #include<malloc.h> #include<assert.h> typedef int DataType; typedef struct ListNode { struct ListNode *_next; DataType _data; }ListNode; void PrintList(ListNode *&pHead) { while(pHead)

C语言数据结构之单链表

链表由多个节点构成,节点之间可以灵活的插入.删除.链表以结构体的自引用原理,可以在内存中以不连续的方式动态分配内存来存储数据,这样的结构体就是链表的一个节点. 一个节点分为两个域:一个是数据域,一个是指针域,这方便链表在存储数据的同时可以方便地找到下一个节点. 相比于数组:数组定义相对简单些,是以连续的内存存储数据,在定义时就确定了长度,这样相比于链表的动态存储,数组就存在有可能数据不够长或内存浪费的缺点. 对于单链表,在此从建立链表开始,实现链表的增添.删除和输出链表内容.由于链表是动态存储,