链表C版

链表的介绍主要看之前写的c++版链表,这里就不再多说了。

http://blog.csdn.net/sherilindas/article/details/52207222

先看头文件

头文件 LinkList.h
typedef struct LinkList         //定义节点
{
  int data;
  struct LinkList* next;
}List;

List* createList();             //创建表头
void insertNode(List* list,int value,int index);        //插入节点
int deleteNode(List* list,int index);                   //删除节点
int getElement(List* list,int index);                   //得到index处元素
void listTravel(List* list);                            //遍历链表
void clearList(List* list);                                       //清空链表
void deleteList(List* list);                                      //删除链表

定义的节点分为数据域data和指针域next,数据域是用于存储各种类型数据,包括复杂类型(这里用int类型),指针域则是用于连接下一个节点的。

从创建表开始,创建表有两种方式,一种是只创建表头,一种是整表创建,即是你给我一个数组,我把他们直接弄成一个链表。
下面这是只创建表头的:

List* createList() //创建表头
{
    List* header=malloc(sizeof(List));
    header->data=0;                         //表头的数据域无意义,但是可以用于存储表的长度
    header->next=NULL;
    return header;
}

只创建表头很简单,只要从系统中拿到一个内存做表头,并将其初始化,然后返回表头地址即可。

这个是整表创建的:

List* createWholeList(int arr[],int n)   //arr为数组,n为数组内元素个数        //整表创建
{
    List* header=malloc(sizeof(List));
    int i=0;
    header->data=0;
    header->next=NULL;
    List* currentList=header;
    for(i=0;i<n;i++)
    {
        List* newNode=malloc(sizeof(List));
        newNode->data=arr[i];
        newNode->next=currentList->next;
        currentList->next=newNode;
        currentList=newNode;
    }
    return header;
}

整表创建就稍微复杂一些了。createWholeList这个函数需要调用时传一个数组,和这个数组的元素个数。先创建表头。然后一个一个的申请内存,赋值,然后按照尾插法或头插法插入到表中。最后返回表头地址。
下面讲下尾插法和头插法:

尾插法的主要算法是:
1、新节点newNode的指针域指向当前链表next
2、当前链表currentList的next指向新节点newNode
3、当前链表currentList等于新节点newNode

newNode->next=currentList->next;
currentList->next=newNode;
currentList=newNode;

这里写图片描述

头插法的主要算法是:
1、新节点newNode的指针域指向当前链表currentList
2、当前链表currentList等于新节点newNode

newNode->next=currentList;
currentList =newNode;

这里写图片描述

另外的插入,删除,以及清空链表算法操作详解可以看之前写的那篇

http://blog.csdn.net/sherilindas/article/details/52207222

插入的时候要传参数要插入的值和要插入的位置。

下面是全部的文件:

文件LinkList.c:
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"


List* createList()                                                      //创建表头
{
    List* header=malloc(sizeof(List));
    header->data=0;
    header->next=NULL;
    return header;
}

List* createWholeList(int arr[],int n)   //arr为数组,n为数组内元素个数        //整表创建
{
    List* header=malloc(sizeof(List));
    int i=0;
    header->data=0;
    header->next=NULL;
    List* currentList=header;
    for(i=0;i<n;i++)
    {
        List* newNode=malloc(sizeof(List));
        newNode->data=arr[i];
        newNode->next=currentList->next;
        currentList->next=newNode;
        currentList=newNode;
    }
    return header;
}


void insertNode(List* list,int value,int index)                         //往index处插入值为value的元素
{
    List* temp=NULL;
    List* newNode=malloc(sizeof(List));
    List* currentList=list;
    int i=0;
    if(newNode==NULL||index<=0||index>list->data+1) return ;
    for(i=1;i<index;i++)
    {
        currentList=currentList->next;
    }
    temp=currentList->next;
    newNode->data=value;
    currentList->next=newNode;
    newNode->next=temp;
    list->data++;
}

int deleteNode(List* list,int index)                            //删除index处的元素,并返回
{
    int e=0,i=0;
    List* currentList=list;
    List* preTemp=NULL;
    List* nextTemp=NULL;
    if(0==list->data||index<=0||index>list->data) return 0;
    for(i=1;i<=index;i++)
    {
        preTemp=currentList;
        currentList=currentList->next;
    }
    nextTemp=currentList->next;
    e=currentList->data;
    free(currentList);
    currentList=preTemp;
    currentList->next=nextTemp;
    list->data--;
    return e;

}

int getElement(List* list,int index)                            //获取index处的元素
{
    int i=0,e=0;
    List* currentList=list;
    for(i=1;i<=index;i++)
    {
        currentList=currentList->next;
    }
    e=currentList->data;
    return e;
}


void listTravel(List* list)                                             //遍历链表
{
    List* currentList=list;
    while(currentList->next!=NULL)
    {
        currentList=currentList->next;
        printf("%d\n",currentList->data);
    }
}

void clearList(List* list)                                       //清空链表
{
    List* currentList=list->next;
    while(currentList!=NULL)
    {
        List* tempList=currentList->next;
        free(currentList);
        currentList=tempList;
    }
    list->next=NULL;
}

void deleteList(List* list)                                        //删除链表
{
    List* currentList=list;
    clearList(currentList);
    free(list);
    list=NULL;
}
文件:main.c:
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"


int main()
{
    int arr[5]={1,2,3,4,5};
    List* header=NULL;
    header=createWholeList(arr,5);        //整表创建
    listTravel(header);                   //打印1,2,3,4,5
    deleteList(header);
   /***
    List* header=NULL;
    int e;
    header=createList();             //创建表头
    insertNode(header,1,1);
    insertNode(header,2,2);
    insertNode(header,3,3);
    insertNode(header,4,4);
    listTravel(header);             //打印结果1,2,3,4
    printf("\n\n");
    insertNode(header,5,2);         //往2处插入5
   // listTravel(header);             //打印结果1,5,2,3,4

    e=deleteNode(header,2);           //删除位置2处节点
    printf("now delete node data is %d\n",e);     //打印5
    listTravel(header);               //1,2,3,4

    clearList(header);              //清空链表
    listTravel(header);             //什么都打不出

    deleteList(header);
    ****/
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值