数据结构:链表

下面是完整的代码:

/*
 * Data Structure
 * this file is the implemention of the Linked List 
 * author: John Woods
 * date: 2015/5/7
 * statement: anyone can use this file for any purpose
 */

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define BOOL int
#define TRUE 1
#define FALSE 0

/* structure of the node */
typedef struct LLNode {
    int data;
    struct LLNode * next;
} * LLNode;

/* structure of the linked list */
typedef struct LinkedList {
    LLNode Head;
    int Length;
}* LinkedList;

/* menu declaration */
void menu();
void insert(LinkedList MyLL);
void delete(LinkedList MyLL);
void current(LinkedList MyLL);

/* operations declaration */
void listInit(LinkedList * MyLL);
void listInsert(LinkedList MyLL, int index, int value);
BOOL listDelete(LinkedList MyLL, int index, int * value);
void listTraverse(LinkedList MyLL);
void listClear(LinkedList MyLL);
void listDestroy(LinkedList * MyLL);
BOOL getElem(LinkedList MyLL, int index, int * value);
BOOL isExist(LinkedList MyLL);

int main(void) {
    LinkedList MyLL = NULL;
    int choice;
    char c;
    while(TRUE) {
        menu();
        while(!scanf("%d", &choice)) while(‘\n‘ != (c=getchar()) && EOF != c);
        switch(choice) {
            case 1:
                listInit(&MyLL);
                break;
            case 2:
                insert(MyLL);
                break;
            case 3:
                delete(MyLL);
                break;
            case 4:
                current(MyLL);
                break;
            case 5:
                listTraverse(MyLL);
                break;
            case 6:
                listClear(MyLL);
                break;
            case 7:
                listDestroy(&MyLL);
                break;
            default:
                exit(EXIT_SUCCESS);
                break;
        }
    }
    return 0;
}

/* menu implemention */
void menu() {
    printf("\n\t**********************MENU**********************\n");
    printf("\t* 1.create a linked list  2.insert an element  *\n");
    printf("\t* 3.delete an element     4.get an element     *\n");
    printf("\t* 5.traverse the list     6.clear the list     *\n");
    printf("\t* 7.destroy the list      8.exit               *\n");
    printf("\t**********************MENU**********************\n");
    printf("Give me your choice:");
}

void insert(LinkedList MyLL) {
    int index, value;
    char c;    
    while(TRUE) {
        printf("Please input the position:");
        while(‘\n‘ != (c=getchar()) && EOF != c);
        while(!scanf("%d", &index)) while(‘\n‘ != (c=getchar()) && EOF != c);
        printf("Please input the value:");
        while(‘\n‘ != (c=getchar()) && EOF != c);
        while(!scanf("%d", &value)) while(‘\n‘ != (c=getchar()) && EOF != c);
        listInsert(MyLL, index, value);    
        
        while(‘\n‘ != (c=getchar()) && EOF != c);
        printf("Go on?(y/n):");
        c = getchar();
        if(c != ‘y‘ && c != ‘Y‘) break;
    }
}

void delete(LinkedList MyLL) {
    int index, value;
    char c;    
    while(TRUE) {
        printf("Please input the position:");
        while(‘\n‘ != (c=getchar()) && EOF != c);
        while(!scanf("%d", &index)) while(‘\n‘ != (c=getchar()) && EOF != c);
        if(listDelete(MyLL, index, &value)) {
            printf("The deleted value is %d in position %d\n", value, index);
        }else {
            printf("Delete unsuccessfully!\n");
        }
        
        while(‘\n‘ != (c=getchar()) && EOF != c);
        printf("Go on?(y/n):");
        c = getchar();
        if(c != ‘y‘ && c != ‘Y‘) break;
    }
}

void current(LinkedList MyLL) {
    int index, value;
    char c;    
    printf("Please input the position:");
    while(‘\n‘ != (c=getchar()) && EOF != c);
    while(!scanf("%d", &index)) while(‘\n‘ != (c=getchar()) && EOF != c);
    if(getElem(MyLL, index, &value)) {
        printf("The value in position %d is %d\n", index, value);
    }
}

/* operations implemention */
void listInit(LinkedList * MyLL) {
    if(isExist(*MyLL)) {
        printf("Linked list already exist!\n");
        return;
    }
    if(NULL == (*MyLL = (LinkedList)malloc(sizeof(struct LinkedList)))) {
        printf("Out of Memory!\n");
        exit(EXIT_FAILURE);
    }
    (*MyLL)->Length = 0;
    (*MyLL)->Head = NULL;
    printf("Initial successfully!\n");
    
}

void listInsert(LinkedList MyLL, int index, int value) {
    if(!isExist(MyLL)) {
        printf("This linked list does not exist! Please initial it first!\n");
        return;
    }
    if(index > MyLL->Length+1 || index < 1) {
        printf("You input wrong index!\n");
    }
    LLNode pInsert = NULL, pNode = MyLL->Head;
    if(NULL == (pInsert = (LLNode)malloc(sizeof(struct LLNode)))) {
        printf("Out of memory!\n");
        exit(EXIT_FAILURE);
    }
    pInsert->data = value;
    pInsert->next = NULL;
    if(1 == index) {
        pInsert->next = MyLL->Head;
        MyLL->Head = pInsert;
    }else {
        --index;
        while(--index) pNode = pNode->next;
        pInsert->next = pNode->next->next;
        pNode->next = pInsert;
    }
    MyLL->Length++;
    pNode = NULL;
    pInsert = NULL;
    printf("Insert successfully!\n");
}

BOOL listDelete(LinkedList MyLL, int index, int * value) {
    if(!isExist(MyLL)) {
        printf("This linked list does not exist! Please initial it first!\n");
        return FALSE;
    }
    if(index > MyLL->Length || index < 1) {
        printf("You input wrong index!\n");
        return FALSE;
    }
    LLNode pDelete = NULL, pNode = MyLL->Head;
    if(1 == index) {
        pDelete = MyLL->Head;
        MyLL->Head = MyLL->Head->next;
    }else {
        --index;
        while(--index) pNode = pNode->next;
        pDelete = pNode->next;
        pNode->next = pNode->next->next;
    }
    MyLL->Length--;
    *value = pDelete->data;
    free(pDelete);
    pNode = NULL;
    pDelete = NULL;
    printf("Delete successfully!\n");
    return TRUE;
}

void listTraverse(LinkedList MyLL) {
    if(!isExist(MyLL)) {
        printf("This linked list does not exist! Please initial it first!\n");
        return;
    }
    LLNode pNode = MyLL->Head;
    int Len = MyLL->Length;
    printf("Length of this linked list is %d\nIts elements are following:\n", MyLL->Length);
    printf("\tHead->");
    while(pNode && Len) {
        printf("%d->", pNode->data);
        pNode = pNode->next;
        Len--;
    }
    printf("End\n");
}

void listClear(LinkedList MyLL) {
    if(!isExist(MyLL)) {
        printf("This linked list does not exist! Please initial it first!\n");
        return;
    }
    LLNode pDestroy = NULL, pNode = MyLL->Head;
    while(pNode) {
        pDestroy = pNode;
        pNode = pNode->next;
        free(pDestroy);
    }
    MyLL->Length = 0;
    printf("This linked list is empty now!\n");
}

void listDestroy(LinkedList * MyLL) {
    if(!isExist(*MyLL)) {
        printf("This linked list does not exist!\n");
        return;
    }
    listClear(*MyLL);
    free(*MyLL);
    *MyLL = NULL;
    printf("This linked list has been destroyed successfully!\n");
}

BOOL getElem(LinkedList MyLL, int index, int * value) {
    if(!isExist(MyLL)) {
        printf("This linked list does not exist! Please initial it first!\n");
        return FALSE;
    }
    if(index > MyLL->Length || index < 1) {
        printf("You got wrong index!\n");
        return FALSE;
    }
    LLNode pNode = MyLL->Head;
    while(--index) pNode = pNode->next;
    *value = pNode->data;
    return TRUE;
}

BOOL isExist(LinkedList MyLL) {
    if(NULL == MyLL) {
        return FALSE;
    }else {
        return TRUE;
    }
}

如果不加链表长度的控制条件,遍历清空之后的链表任然会按照之前的长度进行访问,只不过数据是有问题的,所以需要加长度控制!不知道还有没有其他的方法来解决这个问题!

时间: 2025-01-02 02:43:33

数据结构:链表的相关文章

基础数据结构 链表、栈、队列

数据结构是程序设计中一个非常重要的部分,基本的数据结构包括链表.栈和队列,当然高级一点的还有树.图等,实际上链表.栈和队列都是线性表,只是在操作和表示方式上有所不同,线性表用顺序结构表示就是顺序表,用链结构表示就是链表,如果对线性表的操作加以限制,只能有在表尾进行插入和删除元素,这就变成栈了,如果只能允许元素从表尾插入,表头删除,这就变成队列了. 链表 /* * 数据结构 链表 * 链式结构 */ #include <iostream> using namespace std; enum St

数据结构链表学习

今天初步学习数据结构链表,学习过程中感觉对于指针的理解还差很多,而且对于VS的调试也不会使用,调查问题只能靠一遍一遍的梳理逻辑,效率不是一般的低下..接下来得赶紧学习下VS的使用.. 今天链表只是初步学习,写的例子也比较简单,如下: 定义链表的数据结构,只简单的定义了一个数据和一个指向后继的指针 1 struct List { 2 int num; 3 List *next; 4 }; 接下来就是链表的创建,返回一个指针地址赋给主函数中的头指针,用于之后的增删改查等等 1 List *creat

数据结构——链表的封装

链表是数据结构中最基本的线性结构,在编程中使用的频率最高,那么如何用封装思想来编写一个完整的链表操作呢?且看以下代码的实例. /*功能:演示链表的操作方法 */              /*作者: james */              /*时间: 2014.7.16 */              /*版本: v1.0 */              /*说明:使用面向对象思想封装一个链表*/ #include <stdio.h>              #include <s

Linux内核数据结构——链表

目录 目录 简介 单向链表 双向链表 环形链表 Linux内核中的链表实现 offsetof container_of container_of 第一部分 container_of 第二部分 链表初始化 向链表中增加一个节点 删除节点 移动节点 判断链表是否为空 遍历链表 Demo测试 mlisth mlistc 执行结果 简介 最近在学习Android Binder驱动程序实现的时候,发现里面的数据结构用到了struct list_head.而我google发现struct list_head

第十章 基本数据结构——链表

 链表 链表与数组的区别是链表中的元素顺序是有各对象中的指针决定的,相邻元素之间在物理内存上不一定相邻.采用链表可以灵活地表示动态集合.链表有单链表和双链表及循环链表.书中着重介绍了双链表的概念及操作,双链表L的每一个元素是一个对象,每个对象包含一个关键字和两个指针:next和prev.链表的操作包括插入一个节点.删除一个节点和查找一个节点,重点来说一下双向链表的插入和删除节点操作,图例如下: 链表是最基本的数据结构,凡是学计算机的必须的掌握的,在面试的时候经常被问到,关于链表的实现,百度一下就

delphi.数据结构.链表

链表作为一种基础的数据结构,用途甚广,估计大家都用过.链表有几种,常用的是:单链表及双链表,还有N链表,本文着重单/双链表,至于N链表...不经常用,没法说出一二三来. 在D里面,可能会用Contnrs.pas.TStack/TQueue相关类,进行操作,不过里面的实现,并非使用的是链表实现,只是用TList,然后...实现的. 呵,TList怎么实现那些不是重点,本文着重是说一下自己使用链表的一些心得. 一:单链表: 单链表的用途,主要一个场景:队列(stack/queue),两者区别在于:s

JavaScript数据结构——链表的实现

前面楼主分别讨论了数据结构栈与队列的实现,当时所用的数据结构都是用的数组来进行实现,但是数组有的时候并不是最佳的数据结构,比如在数组中新增删除元素的时候需要将其他元素进行移动,而在javascript中使用spit()方法不需要访问其他元素.如果你在使用数组的时候发现很慢,就可以考虑使用链表. 链表的概念 链表是一种常见的数据结构.它是动态地进行存储分配的一种结构.链表有一个"头指针"变量,以head表示,它存放一个地址,指向一个元素.每个结点都使用一个对象的引用指标它的后继,指向另一

数据结构 链表基础算法

1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 typedef struct node 5 { 6 int data; 7 struct node * pNext; 8 }NODE,* PNODE; 9 //节点定义 10 //函数声明 11 PNODE create_list(); 12 void traverse_list(PNODE); 13 int len_list(PNODE);

C语言提高之——从结构和指针看数据结构链表

通过组合结构和指针可以创建强大的数据结构.该博客只是针对了单链表来看的. 链表说明: 链表的每一个结点都是一个结构体,其中有两个元素分别是:1.指向下一个结点的指针(link)和该结点数据(value).其中需要一个根指针指向第一个结点(root). 插入数据: 初始代码: 插入的思想是通过比较当前结构的数据和要插入的数据(new_value)大小,从而判断插入位置.首先需要定义两个指针变量,一个指向当前结构(current),一个指向当前结构的前一个结构(previous).当判断好位置之后需

Java数据结构--链表

不懂的先看一下这个百度文库资料http://wenku.baidu.com/link?url=sBTDm0r0or_eLyZPHnsGs5mlnKYKtzuX9FveJ-nguoQcFPM-ZjWauNFP0P2cvh7Qx-UZToPFHMzoGT0mB92rza5LkHT78FMzPIUaKqWKnNC 看懂资料在看一下下面的东西 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).对于每个节点来说,除了存储其本身的信息(数据值