数据结构:顺序表

/*
 * this c file is a implementation of linear list
 * author: John Woods
 * date: 2015/5/3
 * exclaim: anyone can use the file to any purpose
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define INIT_LEN 20
#define INCREMENT_SIZE 10
#define BOOL int    /* define boolean type */
#define TRUE 1
#define FALSE 0

/* linear list structure */
typedef struct LinearList {
    int * LL;
    int Length;
    int MaxLength;
} * LinearList;

/* menu */
void menu();
void insert(LinearList myLL);
void delete(LinearList myLL);
void prior(LinearList myLL);
void next(LinearList myLL);
void current(LinearList myLL);

/* operations */
LinearList initList();    /* initial the linear list */
void destroyList(LinearList * p_myLL);    /* destroy the linear list, the linear list must be exist */
void clearList(LinearList myLL);    /* clear the linear list, the linear list must be exist */
BOOL listEmpty(LinearList myLL);    /* if linear list is empty, return TRUE, else return FALSE, and the linear list must be exist */
BOOL getElem(LinearList myLL, int index, int * cur_e);    /* return the value of list[i] in e, the linear list must be exist and i must between 0 and list.length-1 */
BOOL priorElem(LinearList myLLL, int index, int * pre_e);    /* return the prior element of the list[i], the linear list must be exist */
BOOL nextElem(LinearList myLL, int index, int * next_e);    /* return the next element of the list[i], the linear list must be exist */
void listInsert(LinearList myLL, int index, int e);    /* insert a element of e int position of i, the linear list must be exist and the i must between 0 and list.length */
BOOL listDelete(LinearList myLL, int index, int * e);    /* delete the element in position i, and return its value in e, the linear list must be exist */
void listTraverse(LinearList myLL);    /* traverse the list with the function visit() */

BOOL listExist(LinearList myLL);
void myflush();

int main(void) {
    int instruct = 0;
    LinearList myLL = NULL;
    
    while(TRUE) {
        menu();
        while(!scanf("%d", &instruct));
        switch(instruct) {
            case 1:
                myLL = initList();
                myLL->Length = 0;
                myLL->MaxLength = INIT_LEN;
                break;
            case 2:
                listTraverse(myLL);
                break;
            case 3:
                insert(myLL);
                break;
            case 4:
                delete(myLL);
                break;
            case 5:
                prior(myLL);
                break;
            case 6:
                next(myLL);
                break;
            case 7:
                current(myLL);
                break;
            case 8:
                clearList(myLL);
                break;
            case 9:
                destroyList(&myLL);
                break;
            default:
                exit(EXIT_SUCCESS);
                break;
        }
    }
    return 0;
}

void menu() {
    printf("Please choose your operation:\n");
    printf("\t| 1.initial a linear list    2.traverse the list\n");
    printf("\t| 3.insert an element        4.delete an element\n");
    printf("\t| 5.get the prior element    6.get the next element\n");
    printf("\t| 7.get an element           8.clear the linear list\n");
    printf("\t| 9.destroy the linear list  0.exit\n");
    printf("Give me your choice:");
}

void insert(LinearList myLL) {
    int index, e;
    char c,GoOn;
    if(FALSE == listExist(myLL)) {
        printf("Please initial the linear list first!\n");
        return;
    }
    while(TRUE)
    {
        //while(‘\n‘!=(c=getchar()) && EOF!=c);    //clear the stdin stream
        printf("Input the insert position:");
        while(!scanf("%d", &index));
        while(‘\n‘!=(c=getchar()) && EOF!=c);    //clear the stdin stream
        printf("Input the insert value:");
        while(!scanf("%d", &e));
    
        listInsert(myLL, index, e);
        
        while(‘\n‘!=(c=getchar()) && EOF!=c);    //clear the stdin stream
        printf("Go on?(y/n) ");
        GoOn = getchar();
        if(GoOn != ‘y‘ && GoOn != ‘Y‘ && GoOn != ‘\n‘)    break;
    }
}

void delete(LinearList myLL) {
    int index, e;
    char c, GoOn;
    if(FALSE == listExist(myLL)) {
        printf("Please initial the linear list first!\n");
        return;
    }
    while(TRUE) {
        while(‘\n‘!=(c=getchar()) && EOF!=c);    //clear the stdin stream
        printf("Please input the index for delete: ");
        scanf("%d", &index);
        if(listDelete(myLL, index, &e)) {
            printf("The deleted value is %d\n", e);
        }
        
        while(‘\n‘!=(c=getchar()) && EOF!=c);    //clear the stdin stream
        printf("Go on?(y/n) ");
        GoOn = getchar();
        if(GoOn != ‘y‘ && GoOn != ‘Y‘ && GoOn != ‘\n‘)    break;
    }
    
}

void prior(LinearList myLL) {
    int index, pre_e;
    char c;
    if(FALSE == listExist(myLL)) {
        printf("Please initial the linear list first!\n");
        return;
    }
    while(‘\n‘!=(c=getchar()) && EOF!=c);    //clear the stdin stream
    printf("Please input the index: ");
    scanf("%d", &index);
    if(priorElem(myLL, index, &pre_e)) {
        printf("The value before position %d is %d\n", index, pre_e);
    }
}

void next(LinearList myLL) {
    int index, next_e;
    char c;
    if(FALSE == listExist(myLL)) {
        printf("Please initial the linear list first!\n");
        return;
    }
    while(‘\n‘!=(c=getchar()) && EOF!=c);    //clear the stdin stream
    printf("Please input the index: ");
    scanf("%d", &index);
    if(nextElem(myLL, index, &next_e)) {
        printf("The value after position %d is %d\n", index, next_e);
    }
}

void current(LinearList myLL) {
    int index, cur_e;
    char c;
    if(FALSE == listExist(myLL)) {
        printf("Please initial the linear list first!\n");
        return;
    }
    while(‘\n‘!=(c=getchar()) && EOF!=c);    //clear the stdin stream
    printf("Please input the index: ");
    scanf("%d", &index);
    if(getElem(myLL, index, &cur_e)) {
        printf("The value in position %d is %d", index, cur_e);
    }
}

LinearList initList() {
    LinearList myLL = (LinearList)malloc(sizeof(struct LinearList));
    if(NULL == myLL) {
        printf("ERROR:Out of memeory\n");
        exit(EXIT_FAILURE);
    }
    myLL->LL = (int *)malloc(sizeof(int) * INIT_LEN);
    if(NULL == myLL->LL) {
        printf("ERROR:Out of memory\n");
        exit(EXIT_FAILURE);
    }
    
    printf("The linear list has been initialized\n");
    return myLL;
}

void destroyList(LinearList * p_myLL) {
    if(FALSE == listExist(*p_myLL)) {
        printf("Please initial the linear list first!\n");
        return;
    }
    free((*p_myLL)->LL);
    (*p_myLL)->LL = NULL;
    free(*p_myLL);
    *p_myLL = NULL;
    printf("The list has been destroyed!\n");
}

void clearList(LinearList myLL) {
    if(FALSE == listExist(myLL)) {
        printf("Please initial the linear list first!\n");
        return;
    }
    if(FALSE == listEmpty(myLL)) {
        myLL->Length = 0;
        printf("Clear operation is successful!\n");
    }
}

BOOL listEmpty(LinearList myLL) {
    if(0 == myLL->Length) {
        return TRUE;
    }else {
        return FALSE;
    }
}

BOOL getElem(LinearList myLL, int index, int * cur_e) {
    if(index <= myLL->Length && index >= 1) {
        *cur_e = *(myLL->LL + index - 1);
        return TRUE;
    }else {
        printf("You got wrong index!\n");
        return FALSE;
    }
}

BOOL priorElem(LinearList myLL, int index, int * pre_e) {
    if(index > myLL->Length || index <= 1) {
        printf("You got wrong index!\n");
        return FALSE;
    }else {
        *pre_e = *(myLL->LL + index - 2);
        return TRUE;
    }
}

BOOL nextElem(LinearList myLL, int index, int * next_e) {
    if(index >= myLL->Length || index <1) {
        printf("You got wrong index!\n");
        return FALSE;
    }else {
        *next_e = *(myLL->LL + index);
        return TRUE;
    }
}

void listInsert(LinearList myLL, int index, int e) {
    int i;
    if((myLL->Length+1)>myLL->MaxLength) {
        myLL->LL = (int *)realloc(myLL->LL,sizeof(int) * (myLL->MaxLength + INCREMENT_SIZE));
        myLL->MaxLength += INCREMENT_SIZE;
    }
    if(index > myLL->Length+1 || index<1) {
        printf("You got wrong position!\n");
        return;
    }else {
        for(i=myLL->Length-1; i>=index-1; i--) {
            *(myLL->LL + i + 1) = *(myLL->LL + i);
        }
        *(myLL->LL + index - 1) = e;
        myLL->Length++;
        printf("Insert operation is successful!\n");
    }
}

BOOL listDelete(LinearList myLL, int index, int * e) {
    int i;
    if(index > myLL->Length || index < 1) {
        printf("You got wrong index!\n");
        return FALSE;
    }else {
        *e = *(myLL->LL + i - 1);
        for(i = index-1; i < myLL->Length-1; i++) {
            *(myLL->LL + i) = *(myLL->LL + i + 1);
        }
        myLL->Length--;
        printf("Delete operation is successful!\n");
        return TRUE;
    }
}

void listTraverse(LinearList myLL) {
    int i;
    if(FALSE == listExist(myLL)) {
        printf("Please initial the linear list first!\n");
        return;
    }
    printf("Length of the linear list  is %d\n", myLL->Length);
    printf("Its elements are following:\n\t");
    printf("HEAD->");
    for(i=0; i<myLL->Length; i++) {
        printf("%d->", *(myLL->LL + i));
    }
    printf("END\n");
}

BOOL listExist(LinearList myLL) {
    if(NULL == myLL) return FALSE;
    else return TRUE;
}

因为代码在ubuntu环境下编写!在实现的过程中,发现无法用fflush(stdin)清空输入缓冲区,经过查看资料,发现fflush()并不是标准库函数,它的行为也就是未定义的!

fflush(stdin);    /* 该函数非标准库函数,行为未定义,使用此函数会牺牲代码的可移植性 */
while(‘\n‘!=(c=getchar()) && EOF!=c);      /* 清空输入缓冲区的替代语句 */
时间: 2024-11-05 16:40:19

数据结构:顺序表的相关文章

hrbust-1545-基础数据结构——顺序表(2)

http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 412(165 users) Total Accepted: 188(150 users) Rating:  Special Judge: No Description 在长度为n(n<10

数据结构顺序表思想以及完整代码实现

本文转载自趣学算法,方便个人学习参考使用 http://blog.csdn.net/rainchxy/article/details/77946835 数据结构 第3讲 顺序表 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素. 顺序表可以分配一段连续的存储空间Maxsize,用elem记录基地址,用length记录实际的元素个数,即顺序表的长度, 结构体的定义: 结构体定义后,如果要定义个顺序

数据结构----顺序表的增和遍历(2018/10/23)

数据结构包含顺序表和链表 顺序表方便改和查 链表便于增删 顺序表的增和遍历: 代码一: 1 using System; 2 namespace deaiWith 3 { 4 class MySeqList<T> 5 { 6 //实际的元素个数 7 private int _flag; 8 //存储的空间 9 private T[] _ints; 10 public void AddItem(T Item) //增加元素到末尾 ,追加 11 { 12 if (_flag >= _ints.

8.基本数据结构-顺序表和链表

一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计算机中存储的是基于二进制的电影数据,然后我们可以通过相关的视频播放软件结合相关的硬件对电影的二进制数据进行相关的运算操作,所产生的结果就是我们可以看到电影的画面和听到音频的声音. - 问题:阐述计算机如何计算1+2的结果? - 阐述:简单理解为,首先可以将1和2输入到计算机中,然后计算机会将1和2转

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protected Object[] element; 4 5 public SeqList(int length) { 6 this.element = new Object[length]; 7 this.n = 0; 8 } 9 10 public SeqList() { 11 this(64); 12 } 13 1

数据结构——顺序表的实现

/* 线性结构的基本特征: 1. 集合中必存在唯一的一个"第一元素" 2. 集合中必存在唯一的一个"最后元素" 3. 除最后元素之外,均有唯一的后继 4. 除第一元素之外,均有唯一的前驱 对线性表的基本操作: {结构初始化} InitList(&L); //构造一个空的线性表L {结构的销毁} DestroyList(&L); //销毁线性表L {引用型操作} ListEmpty(L); //线性表判空 ListLength(L); //返回线性表长

数据结构顺序表的操作全集(创建,遍历,插入,删除,排序等等)

#include"stdio.h" #include"stdlib.h" #include"malloc.h" #define list_size 100 typedef struct Node { int data[list_size]; int len; }NODE,* PNODE; void creat_list(PNODE L) { int i; int val; int len; /* PNODE L=(PNODE)malloc(siz

数据结构-------顺序表的实现

2016.1-14 顺序表的实现 .h文件 #pragma once #include<stdio.h> #include<string.h> #include<assert.h> #define MAX_SIZE 1000//预定义顺序表为1000 typedef int DataType;//控制以后数据类型 typedef struct SeqList//定义一个结构体 { DataType array[MAX_SIZE];//定义一个数组 size_t size

c数据结构 顺序表和链表 相关操作

编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include<stdlib.h> #define LINK_INIT_SIZE 100#define LISTINCREAMENT 10#define ElemType int#define OVERFLOW -2#define OK 1#define ERROR 0 typedef int status; /

数据结构顺序表Java实现

Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大小,即数据元素的个数. public int getSize(); //如果线性表为空返回 true,否则返回 false. public boolean isEmpty(); //判断线性表是否包含数据元素 e public boolean contains(Object e); //返回数据元素