线性表链表实现

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define sc scanf
  4 #define ElemType int
  5 //线性表的链式表示和实现
  6
  7 typedef struct LNode{
  8     int data;
  9     struct LNode *next;
 10 }LNode,*LinkList;
 11 //关于上面为啥是这样子的,看下面链接即可
 12 //https://zhidao.baidu.com/question/489369235.html
 13
 14 //创建链表,有n个结点
 15 void CreateList(LinkList &L,int n)
 16 {
 17     L = (LinkList)malloc(sizeof(LNode));
 18     L->next = NULL;//创建一个带头结点的单链表
 19     L->data = 0;//用于记录当前链表的元素个数
 20
 21     LNode *p;
 22     for(int i = n;i > 0;i--)
 23     {
 24         p = (LinkList)malloc(sizeof(LNode));//生成新节点
 25         sc("%d",&p->data);
 26         p->next = L->next;
 27         L->next = p;
 28     }
 29 }
 30
 31 //插入元素
 32 bool LinkInsert_L(LinkList &L,int i,ElemType e)
 33 {
 34     LNode *p = L;
 35     int j = 0;
 36     while(p && j < i - 1)
 37     {
 38         p = p->next;
 39         ++j;
 40     }
 41
 42     //判断是否非法位置
 43     if(!p || j > i - 1) {
 44         puts("Oh! Baby! The insertion position is invalid. Please re-enter the insertion position!");
 45         return 0;
 46     }
 47
 48     LNode *s = (LinkList)malloc(sizeof(LNode));
 49     s->data = e;
 50     s->next = p->next;
 51     p->next = s;
 52     return 1;
 53 }
 54
 55 //链表删除元素
 56 bool ListDelete_L(LinkList &L,int i,int &e)
 57 {
 58   //删除第i个元素
 59   LNode *p = L; int j = 0;
 60       while(p->next && j < i - 1)
 61     {
 62         p = p->next;
 63         ++j;
 64     }
 65
 66     //判断是否非法位置
 67     if(!(p->next) || j > i - 1) {
 68         puts("Oh! Baby! The position is invalid. Please re-enter the position!");
 69         return 0;
 70     }
 71
 72     LNode *q = (LinkList)malloc(sizeof(LNode));
 73     q = p->next;
 74     p->next = q->next;
 75     e = q->data;
 76     free(p);
 77     return 1;
 78 }
 79
 80 //合并链表
 81 void MergeList(LinkList &la,LinkList &lb,LinkList &lc)
 82 {
 83     LNode *pa,*pb,*pc;
 84     pa = la->next; pb = lb->next;
 85     lc = pc = la;
 86
 87     while(pa && pb)
 88     {
 89         if(pa->data <= pb->data){
 90             pc->next = pa;
 91             pc = pa;
 92             pa = pa->next;
 93         }
 94         else{
 95             pc->next = pb;
 96             pc = pb;
 97             pb = pb->next;
 98         }
 99     }
100     pc->next = pa? pa:pb;
101     free(lb);
102 }
103
104 //获取链表长度
105 int getListLength(LinkList &L)
106 {
107     LNode *p = L;
108     int cnt = 0;
109     while(p->next != NULL)
110     {
111         p = p->next;
112         ++cnt;
113         //cout << p->data << " ";
114     }
115     return cnt;
116 }
117
118 //获取链表的某个元素
119 bool getElem(LinkList &L,int q,int &e) {
120
121     int length = getListLength(L);
122     if(q < 1 || q > length)
123     {
124         puts("Oh! Baby! The  position is invalid. Please re-enter the position!");
125         return 0;
126     }
127     LNode *p = L;
128     int j = 0;
129     while(p->next && j < q - 1)
130     {
131         p = p->next;
132         j++;
133     }
134     if(p->next == NULL)
135     {
136         puts("Sorry, didn‘t find it");
137         return 0;
138     }
139     else{
140         p = p->next;
141         e = p->data;
142         return 1;
143     }
144 }
145
146 void Reverse_List(LinkList &la,LinkList &lb)
147 {
148       LNode *p = la;
149       while(p->next != NULL)
150       {
151           p = p->next;
152           if(p != NULL)
153           LinkInsert_L(lb,1,p->data);
154     }
155 }
156
157 //遍历链表
158 void LinkList_Traver(LinkList &L)
159 {
160     LNode *p = L;
161     puts("Let‘s do it! Traver! Traver_List!");
162     while(p->next != NULL)
163     {
164         p = p->next;
165         cout << p->data << " ";
166     }
167     puts("");
168 }
169
170 //销毁链表
171 bool List_Destroed(LinkList &L)
172 {
173     LNode *p;
174     if(L == NULL) return 0;
175     while(L->next)
176     {
177         p = L->next;
178         free(L);
179         L = p;
180      }
181     return 1;
182 }
183 int main()
184 {
185     LinkList la,lb,lc,ld;
186     int n;
187     sc("%d",&n);
188     CreateList(la,n);
189     CreateList(lb,n);
190     CreateList(ld,0);
191
192
193 //    for(int i = 1;i <= 5;i++)
194 //    {
195 //        LinkInsert_L(la,i,i);
196 //    }
197
198     cout << "la length = " << getListLength(la) << endl;
199     cout << "lb length = " << getListLength(lb) << endl;
200
201     int ele;
202     if(getElem(la,5,ele))
203     {
204         cout << ele << endl;
205     }
206
207     if(getElem(lb,1,ele))
208     {
209         cout << ele << endl;
210     }
211
212     LinkList_Traver(la);
213     LinkList_Traver(lb);
214
215     MergeList(la,lb,lc);
216     LinkList_Traver(la);
217     LinkList_Traver(lc);
218
219     Reverse_List(la,ld);
220     cout << "Traver ld = ";
221     LinkList_Traver(ld);
222
223     List_Destroed(la);
224     LinkList_Traver(la);
225     return 0;;
226 }

原文地址:https://www.cnblogs.com/mch5201314/p/11614021.html

时间: 2024-10-18 15:55:03

线性表链表实现的相关文章

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

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

线性表--链表(PHP实现)

上一篇文章写了线性表的基本概念以及用C语言实现链表,有兴趣的同学可以看看:线性表--链表(C语言实现). 现在,我们来看看用PHP来实现链表. 我们都知道,链表由一个个结点组成.在c语言中,我们用结构来定义一个结点,那么在PHP中我们用什么来定义结点? 当然是类. <?php //用面向对象的思想定义结点 class Node { public $value; public $next = null; } 先给出创建和遍历链表的代码,我们再说说链表的插入和删除操作,比起用顺序存储结构实现线性表的

数据结构(二)线性表——链表

通常情况下,链接可分为单链表.双向链表和循环链表三种常用类型. 一.单链表基本操作的实现 使用链式存储结构来实现的线性表称为链表.首元结点.头结点.头指针.空指针. 1.单链表的类型定义 typedef struct LNode//结点类型 { LElemType data;//数据域 struct LNode * next;//指针域 } LNode, * LinkList; 2.初始化操作InitLinkList(&L) Status InitLinkList(LinkList &L)

线性表-链表(三)

一.单链表基本操作 (1)清空单链表 while(L->next){ p=L->next; L->next=p->next; free(p); } 分析:p 指向L的 next 域,L的 next域 在指向 p 的 next 域(p=L->next),其实就是L指向了 L 的 next 的 next 域.然后清空 p 不断循环,知道 L->next == NULL (2)销毁单链表 while(L){ p=L->next; free(L); L=p; } (3)单

作业1 线性表 链表 的定义和实现

1 #include <iostream> 2 using namespace std; 3 4 5 template<class T> 6 struct SLNode 7 { 8 T data; 9 SLNode<T>* next; 10 SLNode(SLNode<T>*nextNode=NULL){next=nextNode;} 11 SLNode(const T&item,SLNode<T>*nextNode=NULL) 12 {

线性表-链表(一)

一,定义 什么是单链表呢? 单链表是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点都包含指向下一个节点的链接,也就是指针 单链表的特点是什么呢? - 数据元素在 逻辑关系上相邻 ,用指针表示 - 单链表 中访问数据元素时需从头开始,即顺序访问 - 比顺序表的优势在于,提供高效的重排数据项的能力 C代码: typedef struct LNode { ElemType data: struct LNode *next: }LNode, *LinkList: 其中 data 是数据域

线性表-链表(四)

一.循环链表 什么是循环链表? 最后一个结点的链接又指回头结点(第一个结点)的链表,整个链表形成一个环.与单链表相比,操作时判断最后一个结点的条件为:结点的链接是否为头结点 空表 条件:L->next==L 非空表 条件 p->next==L 二.双向链表 -什么是双向链表? 用两个链接表示元素间的逻辑关系,其一指向直接后继,其二指向直接前驱. 算法描述 typedef struct DuLNode{ Elem Type data; struct DuLNode *prior; struct

06 线性表 链表概述

链表结构: 链表分类:带头结点    不带头结点 表示一个空表: 原文地址:https://www.cnblogs.com/CPU-Easy/p/11689548.html

线性表-链表(二)

一,单链表的插入 (1)单链表如何插入一个新元素呢? 在单链表中 有序对: 变成 图例: 注意:在单链表中插入只需要修改指针.若要在第 i 个结点之前插入元素,修改的是是第 (i-1) 个结点的指针. (2)单链表的插入元素的代码怎么写呢? 代码如下: Status ListInsert(LinkList &L, int i ,ElemType e){ p=L; j=0; while(p && j<i-1){ p=p->next; ++j; } if(p &&a