数据结构初学练习 C/C++ 01

学计算机不敲代码是不行的。。。动手敲一下单链表的程序

头文件

/* 
 * 单链表(带头结点) 
 * 功能:创建 初始化 销毁 增加 删除 修改 查询
 *  
*/

#ifndef _h_LK
#define _h_LK

/* 数据类型:字符型,长度可变,不存在第0个元素 */
typedef struct LNode{
    int size;
    char *p_str;
    LNode *next;
} *LinkList, LNode;

/******************************************************
 * 定义一个空链表,并返回头结点
******************************************************/
LNode * initLinklist();

/******************************************************
 * 用字节流建立一个链表,并返回头结点
******************************************************/
LNode * NewLinklist(char **pp,int ppSize,int pSize[]);

/******************************************************
 * 判断链表是否为空,空则返回真
******************************************************/
bool isEmpety(LinkList root);

/******************************************************
 * 按位查询,返回该结点指针,0->根结点
 * 该结点不存在时,返回空
******************************************************/
LNode * ListFindByNum(LinkList root, int i);

/******************************************************
 * 按位插入元素,返回该元素指针【同前插】
 * 该位置不存在时,返回空
******************************************************/
LNode * ListInsertByNum(LinkList root, int i, int eSize, char *e_p);

/******************************************************
 * 返回链表长度【不包含头结点】
******************************************************/
int ListLength(LinkList root);

/******************************************************
 * 销毁链表
******************************************************/
void DelLinkList(LinkList root);

/******************************************************
 * 删除第i个元素,返回删除结果
******************************************************/
bool DelLNode(LinkList root,int i);


/******************************************************
 * 打印链表
******************************************************/
void PrintLinkList(LinkList root);

#endif

实现代码

/* 
 * 单链表(带头结点) 
 * 功能:创建 初始化 销毁 增加 删除 修改 查询
 *  
*/
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
#define Maxsize 100

/*
 * 定义一个空链表,并返回头结点
*/
LNode * initLinklist(){
    LinkList root = (LinkList) malloc(sizeof(LNode));
    root->size = 0;
    root->p_str = NULL;
    root->next = NULL;
    return root;
}


/******************************************************
 * 用字节流建立一个链表,并返回头结点
******************************************************/
LNode * NewLinklist(char **pp,int ppSize,int pSize[]){
    LNode *root = initLinklist();
    LNode *pr = root;
    for(int i=0;i<ppSize;i++){
        pr->next = (LNode *) malloc(sizeof(LNode));
        pr = pr->next;
        pr->p_str = pp[i];
        pr->size = pSize[i];
    }
    pr->next = NULL;
    return root;
}

/* 判断链表是否为空,空则返回真 */
bool isEmpety(LinkList root){
    return (root->next==NULL)?true:false;
}

/*
 * 按位查询,返回该结点指针,0->根结点
 * 该结点不存在时,返回空
*/
LNode * ListFindByNum(LinkList root, int i){
    LNode *p = root;
    int n=0;
    while( n<i && p!=NULL ){
        p = p->next;
        n++;
    }
    return p;
}

/*
 * 按位插入元素,返回该元素指针【同前插】
 * 该位置不存在时,返回空
*/
LNode * ListInsertByNum(LinkList root, int i, int eSize, char *e_p){
    LNode *p = ListFindByNum(root,i-1);//查找第i个结点的前驱结点

    if(p==NULL)
        return NULL;
        
    LNode *newNode = (LNode *) malloc(sizeof(LNode));
    newNode->p_str = e_p;
    newNode->size = eSize;
    newNode->next = p->next;
    p->next = newNode;
    return newNode;
}

/******************************************************
 * 返回链表长度【不包含头结点】
******************************************************/
int ListLength(LinkList root){
    LNode *p = root;
    int res=0;
    while((p->next) != NULL){
        p = p->next;
        res++;
    }
    return res;
}

/******************************************************
 * 销毁链表
******************************************************/
void DelLinkList(LinkList root){
    if(isEmpety(root)){
        free(root);
    }else{
        LNode *a = root;
        LNode *b = root->next;
        while(b != NULL){
            free(a);
            a = b;
            b = b->next;
        }
    }
}

/******************************************************
 * 打印链表
******************************************************/
void PrintLinkList(LinkList root){
    LNode *p = root;
    int i=0;
    while(p->next!=NULL){
        p = p->next;
        printf("%d  %s\n",++i,p->p_str);
    }
}

/******************************************************
 * 删除第i个元素,返回删除结果
******************************************************/
bool DelLNode(LinkList root,int i){
    LNode *p1 = ListFindByNum(root,i-1);
    if(p1==NULL||p1->next==NULL){
        return false;
    }
    LNode *p2 = p1->next;
    p1->next = p2->next;
    free(p2);
    return true;
}

简单调试代码

/* 
 * 单链表(带头结点) 
 * 功能:测试代码
 * 测试对象:LinkList
*/
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"

int main(void){

    //构造并打印链表
    int ppSize = 6;
    int pSize[6] = {4,5,6,7,8,9};
    char **pp = (char **) malloc( sizeof(char*) * ppSize );
    pp[0] = (char*)"123";
    pp[1] = (char*)"1234";
    pp[2] = (char*)"12345";
    pp[3] = (char*)"123456";
    pp[4] = (char*)"1234567";
    pp[5] = (char*)"12345678";
    LNode *root = NewLinklist(pp, ppSize, pSize);
    printf("\n创建链表:\n");
    PrintLinkList(root);

    //查询第i个结点
    printf("\n查询第4个结点\n");
    printf("%s\n",ListFindByNum(root, 4)->p_str);

    //插入元素至头部
    printf("\n插入元素至头部\n");
    char *s = (char*)"test";
    int sSize = sizeof(s);
    ListInsertByNum(root, 1, sSize, s);
    PrintLinkList(root);
    printf("\n链表长度:%d\n",ListLength(root));

    //插入元素至尾部
    printf("\n插入元素至尾部\n");
    ListInsertByNum(root, ListLength(root)+1, sSize, s);
    PrintLinkList(root);

    //删除第一个元素
    printf("\n删除第一个元素\n");
    DelLNode(root,1);
    PrintLinkList(root);

    //删除末尾元素
    printf("\n删除末尾元素\n");
    DelLNode(root,ListLength(root));
    PrintLinkList(root);

    //销毁链表
    DelLinkList(root);

    getchar();
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值