数据结构常用函数(一)

原创 2018年04月16日 21:14:39

数据结构中,我们经常用到了一些操作,比如删除,插入等等,有API函数直接调用,当然是比较好的,但是我们可以尝试一下自己写一下代码。
以简单的录入个人信息为例,首先来看一下这些函数。

#include <stdlib.h>

typedef struct
{
    char key[15];
    char name[20];
    int age;
}DATA;

typedef struct Node{
    DATA data;
    struct Node *next;
}ChainListType;

ChainListType *ChainListAddEnd(ChainListType *head,DATA data);
ChainListType *ChainListAddFirst(ChainListType *head,DATA data);
ChainListType *ChainListFind(ChainListType *head,char *key);
ChainListType *ChainListInsert(ChainListType *head,char *findkey,DATA data);
int ChainListDelete(ChainListType *head,char *key);
int ChainListLength(ChainListType *head); 
void ChainlistPrintAll(ChainListType *head); 

现在我们就来一步一步的实现每一个函数
1.遍历链表

void ChainlistPrintAll(ChainListType *head)
{
    ChainListType *h;
    DATA data;
    h=head;
    printf("list as fllowing:\n");
    while(h){//处理每一个节点
        data=h->data;
        printf("(%s,%s,%d)\n",data.key,data.name,data.age);
        h=h->next;//准备处理下一个节点
    }
    return ;
}

2.链表元素个数

int ChainListLength(ChainListType *head)
{
    ChainListType *h;
    int i=0;
    h=head;
    while(h){
        i++;
        h=h->next;//遍历计数
    }
    return i;
}

3.删除某个节点

int ChainListDelete(ChainListType *head,char *key)
{
        ChainListType *node,*h;
        node=h=head;
        while(h){
            if(strcmp(h->data.key,key)==0){//找关键字
                node->next=h->next;
                free(h);//释放内存
                return 1;
            }else{
                node=h;
                h=h->next;//没找到就接着找
            }
        }
        return 0;
}

4.插入某个元素

ChainListType *ChainListInsert(ChainListType *head,char *findkey,DATA data)
{
    ChainListType *node,*node1;
    if(!(node=(ChainListType *)malloc(sizeof(ChainListType))))
    {
        printf("node's application fail!\n");
        return 0;
    }
    node->data=data;
    node1=ChainListFind(head,findkey);
    if(node1){
        node->next=node1->next;
        node1->next=node;
    }else{
        free(node);
        printf("do not find the place!\n");
    }
}

5.查找某个元素

ChainListType *ChainListFind(ChainListType *head,char *key)
{
    ChainListType *h;
    h=head;
    while(h){//节点有效
        if(strcmp(h->data.key,key)==0)
            return h;
        h=h->next;
    }
    return NULL;
}

6.添加头节点

ChainListType *ChainListAddFirst(ChainListType *head,DATA data)
{
    ChainListType *node,*h;
    if(!(node=(ChainListType *)malloc(sizeof(ChainListType))))
    {
        printf("node's application fail!\n");
        return NULL;
    }
    node->data=data;
    node->next=head;
    head=node;
    return head;
}

7.添加尾节点

ChainListType *ChainListAddEnd(ChainListType *head,DATA data)
{
    ChainListType *node,*h;
    if(!(node=(ChainListType *)malloc(sizeof(ChainListType))))
    {
        printf("node's application fail!\n");
        return NULL;
    }
    node->data=data;
    node->next=NULL;
    if(head==NULL){
        head=NULL;
        return head;
    }
    h=head;
    while(h->next!=NULL)
        h=h->next;
    h-next=node;
    return head;
}

我们可以来写一个函数来测试一下

#include <iostream>
#include <string.h>
#include "ChainList_API.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) 
{
    ChainListType *node,*head=NULL;
    DATA data;
    char key[15],findkey[15];

    printf("Enter the data in the linked list, including keywords, names, age:\n");

    do{
        fflush(stdin);
        scanf("%s",data.key);
        if(strcmp(data.key,"0")==0) break;
        scanf("%%d",data.name,data.age);
        head=ChainListAddEnd(head,data);
    }while(1);

    printf("The number of nodes in the linked list is:%d\n",ChainListLength(head));
    ChainlistPrintAll(head);

    printf("\nEnter the insertion node's keyword:\n");
    scanf("%s",&findkey);
    printf("Enter the data in the linked list, including keywords, names, age:\n");
    scanf("%s%s%d",data.key,data.name,data.age);
    head=ChainListInsert(head,findkey,data);

    ChainlistPrintAll(head);

    printf("Enter search keywords:\n");
    fflush(stdin);
    scanf("%s",key);
    node=ChainListFind(head,key);
    if(node){
        data=node->data;
        printf("The keyword %s corresponding node is:(%s,%s,%d)",key,data.key,data.name,data.age);
    }else
        printf("No corresponding node found!\n");

    printf("Enter keywords to delete:\n");
    fflush(stdin);
    scanf("%s",key);
    ChainListDelete(head,key);

    ChainlistPrintAll(head);

    return 0;
}

这里是文件,这个是ChainList_API.c文件,这个是ChainList_API.h文件。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/klaus_x/article/details/79966677

数据结构中常用的函数

数据结构中常用的函数
  • a600423444
  • a600423444
  • 2010-12-27 23:51:00
  • 2663

刷OJ时C++常用函数

1.std::map的相关操作 map m; m.insert(pair(1,2))//或者 m[1]=2; im.count(key);//用来判断是否含有key元素 2.字符串与数字之间的相互转...
  • luchengtao11
  • luchengtao11
  • 2017-03-28 10:02:40
  • 1456

数据结构与算法分析-用C语言实现栈(链表方式)

这种方法用链表来表示栈,头结点始终指向栈顶的元素,每次入栈就是在头结点后面插入一个元素,而出栈则是删除头结点后面的那个元素,思想很简单,有了链表的基础,实现起来也是很容易的。那么老规矩,先将栈ADT的...
  • mrbourne
  • mrbourne
  • 2014-05-20 10:40:35
  • 826

OpenCV_(2):常用数据结构和函数

首先介绍几个常用的结构体: Point2f p(6,2); //二维点 Point3f p3f(8,2,0); //三维点 vector v; vector Points(20);接下来就是几个常用的...
  • chuhang_zhqr
  • chuhang_zhqr
  • 2016-06-30 16:51:22
  • 1791

数据结构:图论:欧拉回路!一笔画问题

从无向图中的一个结点出发走出一条道路,每条边恰好经过一次。这样的路线称为欧拉道路。 奇点的概念:一个点的度数为奇数的时候,这个点就称为:奇点。 无向图中结论: 不难发现,在欧拉道路中,除了起点跟...
  • u010470972
  • u010470972
  • 2014-06-09 14:47:43
  • 1098

数据结构euler一笔画问题

  • 2008年10月15日 23:25
  • 2KB
  • 下载

【原创】一笔画问题(欧拉路)

一笔画问题(euler-circuit.cpp) 题目描述 对给定的一个无向图,判断能否一笔画出。若能,输出一笔画的先后顺序,否则输出“No Solution!” 所谓一笔画出,即每条边仅走一次,每个...
  • c20182030
  • c20182030
  • 2016-10-08 13:37:37
  • 1111

数据结构示例之用链表实现栈

以下是“使用链表实现栈”的简单示例: 1. 用c语言实现的版本 #include #include struct s_node { int data; struct s_node *next...
  • chinawangfei
  • chinawangfei
  • 2016-10-29 10:44:59
  • 1116

Libnids入门

  • 2012年02月15日 09:32
  • 79KB
  • 下载

DDK常用函数与数据结构描述

  • 2009年10月19日 20:08
  • 47KB
  • 下载
收藏助手
不良信息举报
您举报文章:数据结构常用函数(一)
举报原因:
原因补充:

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