数据结构与算法—单链表

原创 2015年07月08日 11:12:35
/*
功能:
创建链表、链表的初始化、链表的长度、快慢指针查找中间值O(n/2)、插入、删除
时间:2015-07-07
人员:西瓜太郎
*/


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



#define MAXSIZE 20
#define ElementType int
#define status int

struct Node;
typedef struct Node *PtrtoNode;
typedef PtrtoNode List;


typedef struct Node
{
    ElementType data;
    struct List *next;

};

int InitList(List *L)
{
    (*L) = malloc(sizeof(struct Node));
    (*L)->next = NULL;
    if(!*L)
        return 0;
    return 1;

}
unsigned int ListLength(List L)
{
    List tempList;
    int i = 0;
    tempList = L->next;
    while(tempList)
    {
        i++;
        tempList = tempList->next;
    }
    return i;
}
void printList(List L)
{
    List tempList;
    tempList = L;
    tempList = tempList->next;
    while(tempList)
    {
        printf("%d ",tempList->data);
        tempList = tempList->next;
    }
    printf("\n");
}
void creatList(List L)
{

    List tempList,temp;
    int i = 1;
    temp = L;
    printf("尾插法创建链表:\n");
    while(i <= MAXSIZE)
    {
        tempList = malloc(sizeof(struct Node));
        tempList->data = rand()%100 + 1;
        printf("%d ",tempList->data);
        
        temp->next = tempList;
        temp = tempList;
        i++;
    }
    temp->next = NULL;
    printf("\n");
    
}
status GetMiddleNode(List L, ElementType *e)
{
    List Middle, search,temp;
    Middle = search = L;
    while(search->next != NULL)
    {
        search = search->next;
        if(search->next != NULL)
        {
            search = search->next;
            Middle = Middle->next;
        }

        
    }
    *e = Middle->data;
    return 1;
}
List FindPreList(List L, int value)
{
    List Pre;
    int i = 0;
    Pre = L;
    if(value < 1 || value > ListLength(L) + 1)
    {
        printf("无法找到%d的前一个数!\n",value);
        exit(EXIT_FAILURE);
    }
    value--;
    while( Pre && i < value)
    {
        i++;
        Pre = Pre->next;
    }
    if(Pre)
        return Pre;
    else
        exit(EXIT_FAILURE);
}
void DeleteList(List L, int deleteItem)
{
    int i = 1;
    List PreList,temp;
    if( deleteItem < 1 || deleteItem > ListLength(L))
    {
        printf("删除数据在链表中不存在!!!\n");
        return ;
    }
    PreList = FindPreList(L,deleteItem);
    temp = PreList->next;
    PreList->next = temp->next;
    free(temp);

}
void InsertList(List L, int Item , int value)
{
    List Pre,InsertNode;
    InsertNode = malloc(sizeof(struct Node));
    InsertNode->data = value;
    if(Item < 0 || Item >ListLength(L))
    {
        printf("插入的位置不对!!!\n");
        return ;
    }
    Pre = FindPreList(L, Item);

    InsertNode->next = Pre->next;
    Pre->next = InsertNode;

}

int main()
{
    List L;
    int item, MiddleElement,DeleteItem,InsertItem,value;
    if(InitList(&L))
        printf("初始化链表成功!\n");
    else
    {
        printf("初始化链表失败!\n");
        return 0;
    }
    printf("初始化L后:ListLength(L) = %d\n",ListLength(L));

    while(1)
    {
        printf("1.查看链表\n");
        printf("2.创建链表(尾插法)\n");
        printf("3.删除链表中的值\n");
        printf("4.向链表中插入值\n");
        printf("5.链表长度\n");
        printf("6.中间节点值\n");
        printf("7.退出\n");
        printf("请选择你的操作:");
        scanf("%d",&item);
        switch(item)
        {
        case 1:
            printList(L);
            break;
        case 2:
            creatList(L);
            break;
        case 3:
            printf("删除第几个元素:");
            scanf("%d",&DeleteItem);
            DeleteList(L,DeleteItem);
            printList(L);

            break;
        case 4:
            printf("插入到第几个元素前、值为多少【X Y】:");
            scanf("%d %d",&InsertItem,&value);
            InsertList(L,InsertItem,value);
            printList(L);
            break;
        case 5:
            printf("链表的长度:%d\n",ListLength(L));
            break;
        case 6:
            GetMiddleNode(L,&MiddleElement);
            printf("中间节点:%d\n",MiddleElement);
            break;
        case 7:
            return 0;
            break;
        default:
            break;

        }
    }
    return 0;
}

数据结构和算法的选择

本部分总结前面介绍的数据结构和算法,并讨论在不同的情况下如何进行选择。 通用数据结构:数组、链表、树、哈希表 专用数据结构:栈、队列、优先级队列 排序:插入排序、希尔排序、快速排序、归并排序...
  • zhangyuehuan
  • zhangyuehuan
  • 2014年03月28日 15:21
  • 18120

数据结构中常用算法

排序常用的算法有:插入算法(直接插入算法、折半插入算法、希尔算法)、选择算法(简单选择算法、堆排序算法)、快速算法(冒泡排序、快速排序算法) 以下程序给出了各种算法的实现,其接口为void sort...
  • ProgramVAE
  • ProgramVAE
  • 2016年12月02日 16:55
  • 482

数据结构和算法经典100题-第1题

说在开头的话:如果拿金庸武侠做个比喻,数据结构和算法的学习就好比是程序员内功。内功的修炼往往不能一蹴而就,需要水滴石川。在博客中的这个分类中,专门记录我在数据结构和算法中的修炼。希望数据结构和算法的武...
  • bobkentblog
  • bobkentblog
  • 2015年03月26日 17:48
  • 1159

如何学好数据结构和算法

数据结构和算法是计算机科学中最重要的课程,作为一名Google的软件工程师,我经常看到一些求职者或刚毕业的学生,他们对于数据结构和算法的学习是远远不够的。这不是说他们看的书是有问题的,或教授们教错了内...
  • liuyi1207164339
  • liuyi1207164339
  • 2015年09月09日 10:22
  • 1408

数据结构和算法学习之路

这篇文章讲了什么? 我这些年学习数据结构和算法的总结。 一些不错的算法书籍和教程。 算法的重要性。 初学 第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并没有让...
  • a_long_
  • a_long_
  • 2016年03月18日 14:29
  • 4203

常见数据结构算法题目

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。       10    / \ ...
  • u011474634
  • u011474634
  • 2013年11月30日 19:54
  • 684

为什么说程序=算法+数据结构!

没有算法的程序,只是一些代码的堆砌,谈不上是一个优秀的软件。 算法是软件的灵魂,得益于好的算法会给软件带来的往往都是质的变化,性能都是呈指数倍提高滴。 算法比较厉害的~去做大数据分析,数据挖掘,数值分...
  • sdewenking
  • sdewenking
  • 2016年06月20日 22:27
  • 5717

数据结构和算法经典书籍

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • duguliuhu190
  • duguliuhu190
  • 2016年03月04日 18:53
  • 2555

Java基础数据结构和算法

数据结构 Array数组 和C/C++以及其他语言一样,Java中的数组有差不多一样的语法。只是Java中除了8中基本类型,数组也是作为对象处理的,所以创建对象时也需要使用new关键字。和大多...
  • ada_dengpan
  • ada_dengpan
  • 2016年04月22日 22:46
  • 22721

数据结构与算法目录

数据结构与算法系列先看这里,有助于你更好地获取内容。 首先明白一个问题:为什么要研究数据结构? 这是因为所有的程序本质上是对数据进行处理,如何高效的处理数据,这依赖于数据本身的结构(如类型(整...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年05月12日 13:48
  • 8037
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构与算法—单链表
举报原因:
原因补充:

(最多只允许输入30个字)