链表的介绍主要看之前写的c++版链表,这里就不再多说了。
先看头文件
头文件 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;
另外的插入,删除,以及清空链表算法操作详解可以看之前写的那篇
插入的时候要传参数要插入的值和要插入的位置。
下面是全部的文件:
文件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;
}