• 数据结构(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);
        
    }
  • 相关阅读:
    160726 smarty 笔记(2)
    160726 smarty 笔记(1)
    smarty内置函数
    smarty变量调节器
    smarty基础原理
    【Django】:基础
    【十八章】:Web框架
    汇总
    jQuery
    DOM
  • 原文地址:https://www.cnblogs.com/jiangcsu/p/5385077.html
Copyright © 2020-2023  润新知