首页 > 代码库 > 算法2---链表1---链表简单的实现

算法2---链表1---链表简单的实现

1 链表的基本知识
 
1.1 基本定义及优缺点
     链表中各个对象按照顺序排列,注意到和数组的区别,数组的线性顺序是由数组下标决定的,但是链表的顺序是由各个对象里的指针决定的。
链表包含两个方面:1 数据部分,保存的是节点的实际数据;2 地址部分,保存的是下一个节点的地址(单链表)。
 
那么链表的优缺点
优点:方便理解,操作方便;
缺点:1在插入和删除操作的时候,往往需要移动大量的数据;2如果表比较大,有时候会难以分配足够的连续空间,导致内存分配失败,而无法存储;
 
1.2 分类
 
单链表:每个节点中只包含一个指针;
双向链表:每个节点包含两个指针,一个指向下一个节点,一个指向上一个节点;
单循环链表:在单链表中,将终端节点的指针域NULL改为指向表头节点或开始节点的就构成单循环链表。
双循环链表:首节点的指向上一个节点的指针指向链表尾节点,尾节点指向下一个节点的指针指向表头及诶到哪构成双循环链表;
 
2 链表的实现C语言版本
 
2.1 简单的实现
首先我们不考虑各种适应性,首先就固定data的形式;
包含两个文件夹list_simple.h,list_simple.c
 
list_simple.h
#ifndef _list_simple_Htypedef struct{    char key[10];    char name[20];    int age;}Data;typedef struct Node{    Data nodeData;    struct Node *nextNode;}CLType;CLType *CLAddEnd (CLType *head,Data nodeData);CLType *CLAddFirst(CLType *head,Data nodeData);CLType *CLFindNode(CLType *head,char *key);CLType *CLinsertNode(CLType *head,char *findkey,Data nodeData);int CLDeleteNode(CLType *head,char *key);int CLLength(CLType *head);void CLAllNode(CLType *head);#endif/*=======================================*///追加结点;CLType *CLAddEnd (CLType *head,Data nodeData){    CLType *node,*htemp;    if (!(node=(CLType)malloc(sizeof(CLType))))//分配空间    {        printf("内存分配失败!\n");        return NULL;    }    else    {        node->nodeData=http://www.mamicode.com/nodeData;//保存数据        node->nextNode=NULL//设置结点指针为空,即为表尾;        if (head==NULL)        {            head=node;            return head;        }        htemp=head;        while(htemp->nextNode!=NULL)        {            htemp=htemp->nextNode;        }        htemp->nextNode=node;        return head;    }}/*=======================================*///插入头结点CLType *CLAddFirst(CLType *head,Data nodeData){    CLType *node;    if (!(node=(CLType)malloc(sizeof(CLType))))    {        printf("内存分配失败\n");        return NULL;    }    else    {        node->nodeData=http://www.mamicode.com/nodeData;        node->nextNode=head;        head=node;        return head;    }}/*=======================================*///查找结点CLType *CLFindNode(CLType *head,char *key){    CLType *htemp;    htemp=head;    while(htemp)    {        if (stcmp(htemp->nodeDate.key,key)==0)        {            return htemp;        }        htemp=htemp->nextNode;    }    return NULL;}/*=======================================*/CLType *CLinsertNode(CLType *head,char *findkey,Data nodeData){    CLType *node,*nodetemp;    if (!(node=(CLType)malloc(sizeof(CLType))))    {        printf("内存分配失败!\n");        return NULL;    }    node->nodeData=http://www.mamicode.com/nodeData;    nodetemp=CLFindNode(head,findkey);    if (nodetemp)    {        node->nextNode=nodetemp->nextNode;        nodetemp->nextNode=node;    }    else    {        printf("未找到争取的的插入位置\n");        free(node);    }    return head;}/*=======================================*///delete the node;int CLDeleteNode(CLType *head,char *key){    CLType *node,*htemp;    htemp=head;    node=head;    while(htemp)    {        if (strcmp(htemp->nodeData.key,key)==0)        {            node->nextNode=htemp->nextNode;            free(htemp);            return 1;        }        else        {            node=htemp;            htemp=htemp->nextNode;        }    }    return 0;}/*=======================================*///计算链表的长度int CLLength(CLType *head){    CLType *htemp;    int len=0;    htemp=head;    while(htemp)    {        len++;        htemp=htemp->nextNode;    }    return len;}/*=======================================*///显示所有的结点void CLAllNode(CLType *head){    CLType *htemp;    Data nodeData;    htemp=head;    printf("当前链表共有%d个结点,链表的所有数据如下:\n", CLLength(head));    while(htemp)    {        nodeData=htemp->nodeData;        printf("node:(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age );        htemp=htemp->nextNode;    }}

 

list_simple.c
 
#include <stdlib.h>#include <stdio.h>#include <string.h>#include "list_simple.h"void main(){    CLType *node,*head=NULL;    Data nodeData;    char key[10];    char findkey[10];    printf("链表测试,输入链表中的数据,输入格式为:关键字 姓名 年龄 \n");    do    {        fflush(stdin);        scanf("%s",nodeData.key);        if (strcmp(nodeData.key,"0")==0)        {            break;//输入0,退出        }        else        {            scanf("%s%d",nodeData.name,&nodeData.age);            head=CLAddEnd(head,nodeData);        }    }while(1);    CLAllNode(head);    printf("演示插入结点,输入插入位置的关键字:\n");    scanf("%s",&findkey);    printf("输入插入结点的数据(关键字 姓名 年龄)\n");    scanf("%s%s%d",nodeData.key,nodeData.name,&nodeData.age);    head=CLInsertNode(head,findkey,nodeData);    CLAllNode(head);    printf("演示删除结点,输入要删除的关键字:\n");    fflush(stdin);    scanf("%s",key);    CLDeleteNode(head,key);    CLAllNode(head);    printf("演示在链表中查找,出入要查找的关键字:\n");    fflush(stdin);    scanf("%s",key);    node=CLFindNode(head,key);    if(node)    {        nodeData=node->nodeData;        printf("关键字对应的结点为(%s%s%d)\n",key,nodeData.key,nodeData.name );    }    else    {        printf("在链表中没有找到你对应的结点\n");    }}

 

 

代码都已经编译通过!可以直接用

后面我们给出一个任意链表中存储任意类型的数据的实现方法,尽请期待:算法2---链表2---链表任意存储的实现

 
 
 
 

算法2---链表1---链表简单的实现