数据结构(C语言版)链表相关操作算法的代码实现

  这次实现的是带头结点的单链表的初始化、遍历、创建、插入、删除、判断链表是否为空、求链表长度函数,编译环境是vs2013。

  其中插入和删除函数中循环的条件目前还不太明白。

#include<iostream>
using namespace std;
typedef int Status;
typedef char Elemtype;
//定义链表的存储结构,注意这里与算法的定义有一处不同,是定义结构体时就命名Lnode,说明*next的类型只要说是Lnode类型就可以
typedef struct Lnode{
    Elemtype data;
    Lnode *next;
}Lnode, *LinkList;
//各函数声明部分
Status InitLinkList(LinkList &L);//初始化
Status CreateList(LinkList &L, int length);//创建链表
Status TraverseList(LinkList L);//遍历
Status GetLength(LinkList L);//求长度
Status IsEmpty(LinkList L);//判断是否为空
Status InsertList(LinkList &L, int target, Elemtype e);//第target个元素前插入元素
Status DeleteList(LinkList &L, int target, Elemtype &e);//删除第target元素
void main(){
    LinkList link=NULL;
    int n=5;
    InitLinkList(link);
    CreateList(link, n);
    //printf("%d",GetLength(link));
    //char *s = IsEmpty(link)?"链表为空!":"链表不为空!";
    //printf("判断结果:%s\n", s);
    //InsertList(link, 2, ‘3‘);
    Elemtype e;
    DeleteList(link,5,e);
    printf("删除的元素是:%c\n", e);
    TraverseList(link);
    getchar();

}
//链表初始化函数:创建头指针,指针域赋空值
Status InitLinkList(LinkList &L){
    L = (LinkList)malloc(sizeof(Lnode));
    if (!L){
        return false;
    }
    L->next = NULL;
    return true;
}
//创建链表函数:
Status CreateList(LinkList &L, int length){
    LinkList p=NULL, q=NULL;
    q = L;
    q->next;
    for(int i = 0; i <length; i++){
        p = (LinkList)malloc(sizeof(Lnode));
        if (!p){
            return false;
        }
        printf("输入存入链表的字符:\n");
        scanf_s("%c", &p->data);
        //2016.4.11报错原因:微软改写了c的函数,加入了参数检测
        //方法:将scanf()函数改为scanf_s()函数
        getchar();
        //2016.4.12循环只读入了第一次,原因是vs不读入回车,输入的回车会作为下次循环的输入,看起来像没读入
        //解决方法:在scanf后写getchar函数,接收回车
        q->next = p;
        p->next = NULL;
        q = p;
    }
    printf("链表创建成功!\n");
    return true;
}
//链表遍历函数
Status TraverseList(LinkList L){
    LinkList p = NULL;
    p = L->next;
    //2016.4.12遍历时第一个元素为空,丢掉了最后一个元素,因为头结点不含有效值
    //所以要将遍历的起点设在第一元素结点处:L->next
    if (!p){
        return false;
    }
    while (p)//注意这里的判断条件是p,不是p->next
    {
        printf("链表中的元素:");
        printf("%c", p->data);
        printf("\n");
        p = p->next;
    }
    return true;
}
int GetLength(LinkList L){
    LinkList p=L->next;//注意这里的起点仍为首元结点,因此返回的链表长度是除去头结点的
    int count=0;
    while (p){
        count++;
        p = p->next;

    }
    return count;
}
//判断链表是否为空
Status IsEmpty(LinkList L){
    if (L->next == NULL){
        return true;
    }
    return false;
}
//在第target个元素前插入一个元素
Status InsertList(LinkList &L, int target, Elemtype e){

    LinkList p=L;//这里起点是头结点,因为可能插在第一个元素之前
    LinkList s = NULL;
    int i = 0;
    while (p&&i < target-1){   //不太懂这里的条件
        p = p->next;
        ++i;
    }
    if (!p||target>i-1){//判断非法位置
        return false;
      }

    s = (LinkList)malloc(sizeof(Lnode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}
//删除第target个元素
Status DeleteList(LinkList &L, int target, Elemtype &e){
    int i=0;
    LinkList p = L;
    LinkList q = NULL;
    while (p->next&&i < target - 1){
        p = p->next;
        i++;
    }
    if (!(p->next) || i>target - 1){
        return false;
    }
    q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);

}
时间: 2024-10-28 09:14:27

数据结构(C语言版)链表相关操作算法的代码实现的相关文章

数据结构c语言版串的操作

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

数据结构(C语言版)顺序表相关算法代码实现

这两天实现了一下顺序表的相关操作,包括顺序表初始化.创建.遍历.第i个元素前插入,删除第i个元素.查找元素e的位置.清空顺序表.销毁顺序表.合并两个非递减顺序表操作. 这次在网上学习到了新的布局方法,将顺序表的存储结构定义,函数说明部分放在了头文件里,源文件中实现的是主函数和各功能函数. 这次使用的编译环境是vc++6.0 //头文件部分 #define LIST_INIT_SIZE 5 #define INCREAMENT 5 typedef char Elemtype; typedef in

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; /

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习

STL之heap相关操作算法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 堆(heap)是一种非常重要的数据结构(这里我们讨论的是二叉堆),它是一棵满足特定条件的完全二叉树,堆的定义如下: 堆是一棵树完全二叉树,对于该完全二叉树中的每一个结点x,其关键字大于等于(或小于等于)其左右孩子结点,而其左右子树均为一个二叉堆. 在上述的定义中,若堆中父亲结点关键字的值大于等于孩子结点,则称该堆为大顶堆:若堆中父亲结点关键子的值小于等于孩子结点,则称该堆为小顶堆. 由于堆是一棵完全二叉树,所以我们可以很轻易地用一个数组存储堆中

深入浅出数据结构C语言版(4)——表与链表

在我们谈论本文具体内容之前,我们首先要说明一些事情.在现实生活中我们所说的"表"往往是二维的,比如课程表,就有行和列,成绩表也是有行和列.但是在数据结构,或者说我们本文讨论的范围内,我们所说的"表"是一维的,即所有"元素"都是前后排列的.就我个人而言,这样的"表"用"队列"来形容比较恰当.但是,数据结构中"队列"这个名词是被一种特殊的"表"给占用了的,所以我们没法再用

深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { int num = 0; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于

常见和链表相关的算法

一. 链表排序 链表排序和数组排序的思路类似,只是链表操作起来比较麻烦,因为不能随机访问,所以只能借助于类似于前置或后置插入,添加等概念来完成.下面给出了链表排序的几种方法. 辅助代码: //单链表节点的定义 typedef struct LinkNode{ int val; struct LinkNode* next; }LinkNode; //由一个数组创建单链表 LinkNode* CreateList(int A[], int count) { if(NULL == A) return

数据结构c语言中单链表删除最小值节点

一: LinkList Delete_Min(LinkList &L){    //L是带头结点的单链表,本算法删除其最小值结点    LNode *pre = L, *p=pre->next;  //p 为工作指针,pre 指向其前驱    LNode *minpre=pre, *minp=p;  //保存最小值结点及其前驱    while(p!=NULL){        if(p->data<minp->data){            minp=p;  //找到