C语言实现顺序表(数据结构线性表部分)

————————————————————————————————————————————

顺序表

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

概念图

模块设计:伪代码写的非常差劲- -见谅

//初始化顺序表(InitList)

使用malloc函数申请一个指定大小100*4字节的地址并将首地址赋值给L的结构体成员elem

if 指针为NULL

函数溢出,退出执行

为结构体成员listsize赋值列表大小100

为结构体成员length赋值元素长度0

返回值(1)

//建立表(Build)

定义整型 i 循环使用

定义整型 n 存储元素个数

if 元素个数超过了列表大小

使用realloc函数对L的结构体成员elem指向的地址空间大小调整为 n+10

if 指针为NULL

函数溢出,退出执行

为结构体成员listsize赋值列表大小 n+10

for i<-0 to n

将输入的数据元素存入第 i 位

为结构体成员length赋值元素长度 n

return OK

//打印表的元素(Print)

定义 int i作为辅助指针时使用

for i++ 0~length

打印顺序表中的元素

打印顺序表中元素的长度

//删除值为X的元素(ListDelete1)

传入顺序表L与需要删除的值X

定义辅助 i

for 遍历顺序表中的元素

if 指针的值等于X

跳出循环

if i等于length(for循环后未找到X)

return ERROR;

i++(执行这一步之前 i 指向X的位置)

for 遍历顺序表

i 位置的值覆盖 i-1 位置的值

长度减一

返回OK;

//删除第X位的元素(ListDelete2)

传入顺序表与位置X-1

定义辅助 i

if 位置在0~length-1之外

return ERROR;

i = x+1(执行这一步之前,x指向需要删除的位置)

for 遍历顺序表

i 的位置覆盖掉 i-1的位置

长度减一

return OK

//逆置函数(Inverse)

定义辅助 i 和 temp

for i 遍历函数的 1/2

首尾交换

//冒泡排序(Sort)

定义辅助 i,j,temp

for i 遍历0~length

for j 遍历 0~length - i

if 第j个大于第j+1个

两数值交换

//插入x,使依然有序(ListInsert)

定义辅助 i,k

if 现在length>=listsize

L->elem重新修改顺序表的长度为原listsize+10

if L->elem等于NULL

exit OVERFLOW

listsize表大小在原来基础上+10

for i 遍历顺序表

if L->elem+i的值>x

跳出循环

k 暂存 i 的值

for i从length向前遍历,直到>k

数据元素向后挪一位

对k位的值赋x

长度加一

return OK

//合并两个线性表(Merger)

main函数中调用InitList和Build新建第二张线性表Lb

将两张线性表传入Merger方法中

定义int i,j,k辅助

定义新顺序表Lc

调用InitList方法初始化Lc

if Lc的顺序表大小<A的长度+B的长度

修改Lc的长度为 A.length+B.length+10

if 指针为NULL

exit溢出

列表大小置为A.length+B.length+10

i,j,k置为0

while i小于A.length且j小于B.length

if 指向L的i的值小于指向Lb的j的值

指向Lc的k的值 = 指向L的i的值

k指向下一个

i指向下一个

else

指向Lc的k的值 = 指向Lb的j的值

k指向下一个

j指向下一个

while i<length //此时默认j超过了length范围

指向Lc的k的值 = 指向L的i的值

k指向下一个

i指向下一个

while j<length

指向Lc的k的值 = 指向Lb的j的值

k指向下一个

j指向下一个

Lc的长度 = L的长度 + Lb的长度

将Lc的值赋给L

return OK

代码实现:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define TRUE 1
  4 #define FALSE 0
  5 #define OK 1
  6 #define ERROR 0
  7 #define OVERFLOW -2
  8 #define LIST_INIT_SIZE 100
  9 #define LISTINCREMENT 10
 10 typedef int status ;
 11 typedef int ElemType ;
 12 typedef struct//结构体定义SqList:其中含有int *elem指针,int length长度,int listsize列表大小
 13 {
 14     ElemType *elem;
 15     int length, listsize;
 16 } SqList;
 17 status InitList(SqList *L)//初始化L
 18 {
 19     L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//L的指针申请长度为100个4字节int空间
 20     if(!L->elem) exit(OVERFLOW);//如果分配不成功则返回溢出
 21     L->listsize = LIST_INIT_SIZE;//定义L->listsize==100
 22     L->length = 0;//L的初始长度为0
 23     return OK;
 24 }
 25 status Build(SqList *L)//建立表,传入的是L的地址
 26 {
 27     int i, n;
 28     printf("Please enter the number of elements n:\n");
 29     scanf("%d", &n); //输入元素个数n
 30     if(n > LIST_INIT_SIZE)
 31     {
 32         //如果元素个数大于n,则使用realloc对malloc申请的内存进行大小的调整,调整为n+10
 33         L->elem = (ElemType *)realloc(L->elem, (n + LISTINCREMENT) * sizeof(ElemType));
 34         if(!L->elem) exit(OVERFLOW);
 35         L->listsize = n + LISTINCREMENT; //列表的大小置为n+10
 36     }
 37     for(i = 0; i < n; i++)
 38         scanf("%d", L->elem + i); //循环输入n个元素
 39     L->length = n; //长度置为n
 40     return OK;
 41 }
 42 void Print(SqList *L) //输出表中元素和长度
 43 {
 44     int i;
 45     for(i = 0; i < L->length; i++)
 46         printf("%d ", *(L->elem + i));
 47     printf("\nlength is:%d\n\n", L->length);
 48 }
 49 void Tips()//提示函数
 50 {
 51     printf("<1> Output sequence table\n");//输出顺序表及顺序表的长度
 52     printf("<2> Delete a node with a value of X \n");//删除值为x的结点
 53     printf("<3> Delete node to locate I \n");//删除给定位置i的结点
 54     printf("<4> Reverse the order table \n");//将顺序表逆置
 55     printf("<5> Sort sequential tables in ascending order \n");//将顺序表按升序排序
 56     printf("<6> Insert x into the appropriate position of the sequence table \n");//将x插入到顺序表的适当位置上
 57     printf("<7> Merge two ordered tables \n");//将两个有序表合并
 58     printf("<0> exit\n\n");//退出
 59 }
 60 status ListDelete1(SqList *L, int x) //删除值为X的元素
 61 {
 62     int i;
 63     for(i = 0; i < L->length; i++)
 64         if(*(L->elem + i) == x)
 65             break;
 66     if(i == L->length)
 67         return ERROR;
 68     for(i++; i < L->length; i++)
 69         *(L->elem + i - 1) = *(L->elem + i);
 70     L->length--;
 71     return OK;
 72 }
 73 status ListDelete2(SqList *L, int x) //删除第X个元素
 74 {
 75     int i;
 76     if(x < 0 || x >= L->length)
 77         return ERROR;
 78     for(i = x + 1; i < L->length; i++)
 79         *(L->elem + i - 1) = *(L->elem + i);
 80     L->length--;
 81     return OK;
 82 }
 83 void Inverse(SqList *L)//逆置函数
 84 {
 85     int i, t;
 86     for(i = 0; i < L->length / 2; i++)
 87     {
 88         t = *(L->elem + i);
 89         *(L->elem + i) = *(L->elem + L->length - i - 1);
 90         *(L->elem + L->length - i - 1) = t;
 91     }
 92 }
 93 void Sort(SqList *L)//冒泡排序(升序)
 94 {
 95     int i, j, t;
 96     for(i = 1; i < L->length; i++)
 97         for(j = 0; j < L->length - i; j++)
 98         {
 99             if(*(L->elem + j) > *(L->elem + j + 1))
100             {
101                 t = *(L->elem + j);
102                 *(L->elem + j) = *(L->elem + j + 1);
103                 *(L->elem + j + 1) = t;
104             }
105         }
106     printf("Arranged in ascending order \n\n");//已按升序排列
107 }
108 status ListInsert(SqList *L, int x) //将X插入,使仍然有序
109 {
110     int i, k;
111     if(L->length >= L->listsize)
112     {
113         L->elem = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));
114         if(!L->elem) exit(OVERFLOW);
115         L->listsize += LISTINCREMENT;
116     }
117     for(i = 0; i < L->length; i++)
118         if(x < * (L->elem + i))
119             break;
120     k = i;
121     for(i = L->length; i > k; i--)
122         *(L->elem + i) = *(L->elem + i - 1);
123     *(L->elem + k) = x;
124     L->length++;
125     return OK;
126 }
127 status Merger(SqList *L, SqList *Lb) //合并两个线性表
128 {
129     int i, j, k;
130     SqList Lc;
131     InitList(&Lc);
132     if(Lc.listsize < L->length + Lb->length)
133     {
134         Lc.elem = (ElemType *)realloc(Lc.elem, (L->length + Lb->length + LISTINCREMENT) * sizeof(ElemType));
135         if(!L->elem) exit(OVERFLOW);
136         Lc.listsize = L->length + Lb->length + LISTINCREMENT;
137     }
138     i = j = k = 0;
139     while(i < L->length && j < Lb->length)
140     {
141         if(*(L->elem + i) < * (Lb->elem + j))
142         {
143             *(Lc.elem + k) = *(L->elem + i);
144             k++;
145             i++;
146         }
147         else
148         {
149             *(Lc.elem + k) = *(Lb->elem + j);
150             k++;
151             j++;
152         }
153     }
154     while(i < L->length)
155     {
156         *(Lc.elem + k) = *(L->elem + i);
157         k++;
158         i++;
159     }
160     while(j < Lb->length)
161     {
162         *(Lc.elem + k) = *(Lb->elem + j);
163         k++;
164         j++;
165     }
166     Lc.length = L->length + Lb->length;
167     *L = Lc;
168     return OK;
169 }
170 int main()
171 {
172     int op, x, flag;
173     SqList L, Lb; //定义SqList类型的两个结构L和Lb
174     InitList(&L);
175     Build(&L);
176     Tips();
177     scanf("%d", &op);
178     while(op)
179     {
180         switch(op)
181         {
182         case 1:
183             Print(&L);
184             break;
185         case 2:
186             printf("Please enter the data you want to delete X :\n");
187             scanf("%d", &x);
188             flag = ListDelete1(&L, x);
189             if(flag)
190                 printf("success!!\n\n");
191             else
192                 printf("Element does not exist, delete failed !!\n\n");
193             break;
194         case 3:
195             printf("Please enter the location you want to delete I :\n");//请输入要删除的位置i
196             scanf("%d", &x);
197             flag = ListDelete2(&L, x - 1); //第i个元素对应的下标为i-1
198             if(flag)
199                 printf("success!!\n\n");
200             else
201                 printf("Element does not exist, delete failed !!\n\n");//元素不存在,删除失败
202             break;
203         case 4:
204             Inverse(&L);
205             break;
206         case 5:
207             Sort(&L);
208             break;
209         case 6:
210             printf("Please enter the data you want to insert X :\n");//请输入要插入的数据X
211             scanf("%d", &x);
212             flag = ListInsert(&L, x);
213             if(flag)
214                 printf("success!!\n\n");//插入成功
215             else
216                 printf("fail!!\n\n");//插入失败
217             break;
218         case 7:
219             printf("Please enter the contents of Lb :\n");//请输入Lb内容
220             InitList(&Lb);
221             Build(&Lb);
222             flag = Merger(&L, &Lb);
223             if(flag)
224                 printf("success!!\n\n");//合并成功
225             break;
226         }
227         Tips();
228         scanf("%d", &op);
229     }
230     return 0;
231 }
时间: 2024-11-06 03:47:12

C语言实现顺序表(数据结构线性表部分)的相关文章

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

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

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

数据结构&gt;&gt;线性表【注意】--&gt;链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目 * A.B是两个递增有序的单链表,元素个数分别是m和n,求 * 集合A-B,并将结果保存在A中,且仍然保持递增有序. * converge_ab */ #include <iostream.h> using namespace std; typedef struct lnode{ int data; struct lnode * next; }lnode; int main(){ lnode * create_chain(int num,int interval,int s

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

数据结构-线性表-顺序表

总括: 线性表是一种最简单的数据结构,线性表的主要操作特点是可以在任意位置插入和删除一个数据元素. 线性表可以用顺序存储结构和链式存储结构存储,用顺序存储结构实现的线性表称为顺序表,用链式存储结构实现线性表称为链表. 1,线性表概述: 线性表:线性表是一种可以在任意位置进行插入和删除数据元素操作的,有n个(n>=0)个相同类型数据元素a0,a1,. . .an组成的线性结构. 线性表抽象数据类型:抽象数据类型是指一个逻辑概念上的类型和这个类型上的操作集合:因此,线性表的抽象数据类型主要包括两个方

数据结构线性表顺序结构的实现

package com.he.list; import java.util.Arrays; import org.w3c.dom.ls.LSException; class ArrayList { private int length;// the list's length private int[] store;// store the data // initialize an empty list public ArrayList initList(String name) { retu

数据结构-02 _用顺序表解决线性表的编程问题

看到这个标题,相必最先应该只到什么是顺序表,什么是线性表. 线性表(linear list):由n(n>=0)个相同的数据类型的数据元素(结点)a0,a1,a2,...an-1 组成的有限序列. 顺序表:把线性表的结构按照逻辑顺序存放在一组地址连续的存储单元里,用这种方式存储的线性表简称顺序表. 线性表的基本操作: 1.初始化操作 2.插入操作:InsertNode(T a,int i) 在线性表的第i个位置插入一个值为a的新元素,使得原序号为i,i+1,...,n 的数据元素的序号变成i+1,

数据结构——线性表

提示:以下内容不适合零基础人员,仅供笔者复习之用. 一.线性结构的基本特征: 1.集合中必存在唯一的一个"第一元素": 2.集合中必存在唯一的一个 "最后元素": 3.除最后元素在外,均有 唯一的后继: 4.除第一元素之外,均有 唯一的前驱. 如:java中的List接口,就是线性表.ArrayList就是顺序线性表,LinkedList就是链表线性表. 二.线性表的基本操作: 1.InitList(*L): 初始化操作,建立一个空的线性表L. 2.ListEmpt

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N