数据结构之线性表

  线性表是最简单最常用的一种数据结构,在生活中各个方面都有应用。

  线性表的定义:线性表大多数情况下是除了第一个位置的数据元素只存在后继元素,最后一个位置的数据元素只存在前驱元素外,所有数据元素都存在前驱和后继的一个有限序列。举个简单的例子就是:字母表中除了 a 只存在后继 b,z 只存在前驱 y之外,剩余的所有字母全部都有前驱和后继。为什么是大多数情况下,是因为线性表的链式存储结构中除了单向链表,还有循环链表和双向链表。

  线性表的存储结构:顺序存储(数组实现,需要预先分配连续的内存空间)和链式存储(链表实现,不需要预先分配内存空间)

  在本篇文章利用C语言对线性表进行实现存储和相应算法。在线性表的链式存储中,我们可以定义结点的数据类型,结点包含两个域,分别为数据域指针域,数据域是用来存储要存储的数据元素的信息,而指针域就是存储下一个结点的地址,也就是指向下一个结点。码一下代码,方便以后回来看。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <math.h>
  4
  5 typedef int ElemType;
  6
  7 typedef struct node
  8 {
  9     ElemType data;
 10     struct node *next;
 11 }LNode,*LinkList;
 12
 13
 14 /*
 15     创建单链表头结点
 16 */
 17 LinkList createList(LinkList L)
 18 {
 19     L = (LinkList)malloc(sizeof(LNode));
 20     if(!L)
 21     {
 22         printf("内存申请失败!");
 23         exit(-1);
 24     }
 25     L->next = NULL;
 26     return L;
 27 }
 28
 29 /*
 30     初始化单链表
 31 */
 32 void InitList(LinkList L)
 33 {
 34     int i=0,n;
 35     LinkList p,s;
 36     p=L;
 37
 38     printf("请输入要建立的线性表长度:");
 39     scanf("%d",&n);
 40
 41     for(i=0; i < n; i++)
 42     {
 43         s = (LinkList)malloc(sizeof(LNode));
 44         if(!s)
 45         {
 46             printf("内存分配失败!");
 47             exit(-1);
 48         }
 49
 50         /*
 51             该函数实现的单向链表的数据元素是利用随机函数随机生成的,
 52             若想自己手动输入可把下面一句注释打开
 53         */
 54     //    scanf("%d",&s->data);
 55         s->data = rand() % 100;
 56         s->next=NULL;
 57         p->next = s;
 58         p = s;
 59     }
 60 }
 61
 62 /*
 63     遍历单链表
 64 */
 65 void TraverseList(LinkList L)
 66 {
 67     LinkList p;
 68
 69     if(!L)
 70     {
 71         printf("线性表不存在!\n");
 72     }
 73     else
 74     {
 75         p = L->next;    //指向线性表的第一个元素
 76         while(p)
 77         {
 78             printf("%d -> ",p->data);
 79             p=p->next;
 80         }
 81             printf("\n");
 82     }
 83 }
 84
 85 /*
 86     逆置单链表
 87 */
 88 void ReverseList(LinkList L)
 89 {
 90     LinkList p,q,s; //创建三个结点指针来进行线性表的逆置
 91     p = L->next;    //p指向第一个元素
 92     q=s=NULL;       //q/s开始置NULL
 93     while(p)        //p是当前要逆置的结点
 94     {
 95         q = p->next;    //q指向p的下一个结点,也就是要逆置的下一个结点
 96         p->next = s;    /* p为第一个结点:逆置后第一个结点变为最后一个结点,所以p的指针域为NULL
 97                             p不为第一个结点:p指向上一个结点
 98                         */
 99         s = p;          //逆置成功后,s指向当前逆置成功的结点
100         p = q;          //p指向要逆置的下一个结点
101     }
102     L->next = s;        //头指针L指向逆置成功后的第一个结点
103     TraverseList(L);
104 }
105
106 /*
107     删除数据为偶数的节点
108 */
109 void DeleteEven(LinkList L)
110 {
111     LinkList p,s,q;
112     p = L;
113     while(p)
114     {
115         s = p;
116         while(s->next)
117         {
118             if(s->next->data % 2 == 0)
119             {
120                 q = s->next;
121                 s->next = q->next;
122                 free(q);
123             }
124             else
125             {
126                 s = s->next;
127             }
128         }
129         p = p->next;
130     }
131     TraverseList(L);
132 }
133
134 /*
135     将单向链表排序
136 */
137 void SortList(LinkList L)
138 {
139     LinkList p,q;
140     int s;
141     for(p = L->next; p->next != NULL; p = p->next)
142     {
143         for(q = p->next; q != NULL; q = q->next)
144         {
145             if(p->data > q->data)
146             {
147                 s = p->data;
148                 p->data = q->data;
149                 q->data = s;
150             }
151         }
152     }
153     TraverseList(L);
154 }
155
156 /*
157     向有序表中插入数据
158 */
159 void InsertList(LinkList L,ElemType n)
160 {
161     LinkList p,s,q;
162     s = (LinkList)malloc(sizeof(LNode));
163     s->data = n;
164
165     if(L->next == NULL)
166     {
167         s->next = NULL;
168         L->next = s;
169     }
170     else if(L)
171     {
172         for(q = L,p = L->next; p != NULL; p = p->next,q = q->next)
173         {
174             if(s->data <= p->data)
175             {
176                 s->next = p;
177                 q->next = s;
178                 break;
179             }
180             if(p->next == NULL)
181             {
182                 s->next = NULL;
183                 p->next = s;
184                 break;
185             }
186         }
187
188     }
189     TraverseList(L);
190
191 }
192
193 /*
194     两个线性表的合并
195 */
196 void UnionList()
197 {
198     LinkList L1,L2,p,s;
199     int n,i = 0;
200
201     printf("\n\n创建线性表L1:\n");
202     L1 = createList(L1);
203     InitList(L1);
204     SortList(L1);
205
206     printf("创建线性表L2:\n");
207     L2 = createList(L2);
208     InitList(L2);
209     SortList(L2);
210
211     printf("合并后线性表:\n");
212     p = L2->next;
213     while(p)
214     {
215         printf("第 %d 次插入: ",++i);
216         InsertList(L1,p->data);
217         p=p->next;
218     }
219
220 }
221
222
223 int main()
224 {
225
226     LinkList L;
227     ElemType n;
228     L = createList(L);
229     InitList(L);
230     TraverseList(L);
231     printf("逆置线性表:\n");
232     ReverseList(L);
233
234     printf("删除数据为偶数的节点:\n");
235     DeleteEven(L);
236
237     printf("排序后的线性表:\n");
238     SortList(L);
239
240     printf("请输入要插入的数据:");
241     scanf("%d",&n);
242     printf("插入数据后的线性表:\n");
243     InsertList(L,n);
244
245     UnionList();
246     return 0;
247 }
时间: 2024-08-05 02:36:29

数据结构之线性表的相关文章

自学数据结构——顺序线性表

胡乱写了一些代码 /* ============================================================================ Name : sqlist.c Author :codecup Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style ==========================================

软考之路--数据结构之线性表

数据就是数值,也就是我们通过观察.实验或计算得出的结果.数据有很多种,最简单的就是数字.数据也可以是文字.图像.声音等.数据可以用于科学研究.设计.查证等.结构,组成整体的各部分的搭配和安排,两者完美结合在一起,我们这样需要重新认识她,对她重新审视与定义:数据结构是程序设计的重要理论和技术基础,她所讨论的内容和技术,对从事软件项目的开发有重要作用,通过学习数据结构,我们学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所设计的数据悬着适当的逻辑结构.存储结构及其相应的操作方法,为提高应

[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列

python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构时,这些高级的数据结构可能给我们以迷惑. 比如,使用list实现queue的时候,入队操作append()时间复杂度可以认为是O(1),但是,出队操作pop(0)的时间复杂度就是O(n). 如果是想利用python学学数据结构的话,我觉得还是自己实现一遍基本的数据结构为好. 1.链表 在这里,我想使

自学数据结构——顺序线性表2

1 /* 2 ============================================================================ 3 Name : sqlist.c 4 Author : codecup 5 Version : 6 Copyright : Your copyright notice 7 Description : Hello World in C, Ansi-style 8 ==================================

数据结构:线性表插入一次删除一次的代码

#include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cstdio> using namespace std; int insertsqlist(int weizhi,double charu,int *t,double b[]){   

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI

数据结构:线性表之单链表

线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储结构: ①顺序存储结构,即存储单元在一段连续的地址上存储,常见的数组就是顺序存储结构的线性表: ②链式存储结构,即存储单元在不连续的地址上存储.因为其不连续性,除了要存数据元素信息(数据域)外,还要存储它后继元素(结点)的地址(指针域,链).学习链式结构最好将结点结构牢记于心,如下图: 链表的每个结点只含有一个指

浅谈数据结构之线性表顺序存储(一)

 首先,数据结构是由某一数据元素集合及该集合中所有数据元素之间的关系组成.具体来说,数据结构应当包含三方面的内容:(1).数据的逻辑结构:(2).数据的存储结构:(3).对数据所施加的操作.而数据的存储结构形式有两种:顺序存储与链式存储.在这里,先谈一谈线性表的顺序存储. 线性表:零个或多个数据元素的有限序列.第一,它是一个序列,也就是说,元素之间是有顺序的:第二,它是有限的,即元素个数是有限的.而线性表的顺序存储结构,说白了,就是在内存中找块地,通过占位的形式把一定的内存空间给占了,然后把相同

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几