抽象数据元素、顺序表、节点、头节点的定义:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//抽象数据元素
typedef struct{
int id;
char *nmae;
}dataElement;
//顺序表
typedef struct{
dataElement DataArray[255];
int length;
}SequenceList;
//节点
typedef struct Node{
dataElement Data;//数据域
struct Node *Next;//指针域
}Node;
//头节点
typedef struct {
int length;//链表长度
Node *Next;//头指针
}LinkList;
单链表的初始化、插入与删除、清空等:
#include "DataElement.h"
void InsertElement(LinkList * linkList,int pos,dataElement element);
dataElement DeletListElement(LinkList * linkList,int pos,dataElement element);
void CleartList(LinkList * linkList);
void DestroyList(LinkList * linkList);
void Prints(LinkList *linkList);
void Print(LinkList *linkList,int pos);
dataElement GetLinkElement(LinkList *linkList,int pos);
//初始化链表
void InitList(LinkList * linkList,dataElement *dataArray,int length){
int i=0;
for(i;i<length;i++){
InsertElement(linkList,i+1,dataArray[i]);
}
if(linkList->length){
printf("初始化成功!(长度:%d)\n",linkList->length);
}
}
//插入表节点
void InsertElement(LinkList * linkList,int pos,dataElement element){
Node *currentNode=linkList->Next;
int i=1;
//1、创建节点并分配内存空间
Node *node=(Node*)malloc(sizeof(Node));
node->Data=element;
node->Next=NULL;
//2、找到要插入的当前位置
if(pos==1){//如果插入的位置为一则直接插入
linkList->Next=node;
linkList->length++;
return;
}
for(i;currentNode&&i<pos-1;i++){
currentNode=currentNode->Next;//循环找到pos当前的元素位置
}
//3、将节点插入并对接节点前后的位置
if(currentNode){
node->Next=currentNode->Next;//把当前节点的前驱设置为新节点
currentNode->Next=node;//把新前节点的前驱设置为当前节点的前驱
linkList->length++;//链表的总长度加一
}
}
//删除表节点
dataElement DeletListElement(LinkList * linkList,int pos){
int i=1;
dataElement element;//被删除的元素
Node * node;//当前节点
Node * frontNode;//前置节点
if(pos==1){
node=linkList->Next;//把要删除的节点暂时赋给node
if(node){
element=node->Data;//记录被删除的数据
linkList->Next=node->Next;//把被删除的元素的next赋给头指针的next。
free(node);//释放被删除的节点
linkList->length--;//删除后表总长度减一。
return element;
}
}
node=linkList->Next;//设定node为第一个元素地址
for(i;node&&i<pos;i++){
frontNode=node;//记录当前节点
node=node->Next;//记录被删除节点的后置节点
}
if(node){
element=node->Data;//记录被删除的数据以便返回
frontNode->Next=node->Next;//把被删除的节点的next非给其前置节点的next;
free(node);//释放被删除的节点
linkList->length--;//表总长度减一;
}
return element;
}
//清空链表
void CleartList(LinkList * linkList){
Node *node=linkList->Next;//
Node *nextNode;//当前节点的后置节点
while(node){
nextNode=node->Next;//记录当前节点的下一节点
free(node);//释放当前节点
node=nextNode;//循环更新当前节点为前一节点的后置节点。
}
linkList->length=0;//表总长度置零
linkList->Next=NULL;//头指针置空
}
//销毁整个表
void DestroyList(LinkList * linkList){}
//输出打印所有节点的元素信息
void Prints(LinkList *linkList){
int i=0;
Node *node=linkList->Next;
if(linkList->length&&linkList->Next){
for(i;i<linkList->length;i++){
printf("%d : %s\n",node->Data.id,node->Data.nmae);
node=node->Next;
}
}else{printf("\n表为空!输出失败!!!\n");}
}
//打印输出指定位置节点的信息
void Print(LinkList *linkList,int pos){
int i=1;
Node *node=linkList->Next;
for(i;i<linkList->length-1;i++){
node=node->Next;
}
printf("%d : %s\n",node->Data.id,node->Data.nmae);
}
//获取链表的某个元素
dataElement GetLinkElement(LinkList *linkList,int pos){
int i=1;
Node *node = linkList->Next;
for(i;node&&i<pos;i++){
node=node->Next;
}
return node->Data;
}
测试:
#include "LinkListOperation.h"
int main(){
dataElement dataArray[]={
{11,"yang"},
{22,"yangmufa"}
};
LinkList *linkList;
/***/
dataElement element;//创建新元素用来插入
element.id=222;
element.nmae=(char*)malloc(10);//开内存
element.nmae="整条街最靓的仔";
//strcpy(element.nmae,"整条街最靓的仔");
linkList=(LinkList*)malloc(sizeof(LinkList));
linkList->length=0;//初始化之前链表长度置零
InitList(linkList,dataArray,sizeof(dataArray)
/sizeof(dataArray[0]));//执行初始函数
printf("\n初始化后:\n");
Prints(linkList);//输出打印整个链表信息
InsertElement(linkList,2,element);//执行插入函数,在下标2处插入element数据元素;
printf("\n插入新节点后:\n");
Prints(linkList);
element=DeletListElement(linkList,1);//执行删除函数删除下标为2元素
printf("\n删除的节点:id :%d --- name :%s \n",element.id,element.nmae);
printf("\n输出单个指定位置的元素信息:");
Print(linkList,2);//执行输出某单个节点的信息函数
CleartList(linkList);//执行清空链表函数
Prints(linkList);//输出打印整个链表信息
printf("\n");
}
运行结果:
/* ------------------- 反爬声明o(*▽*)咻咻咻 --------------------
作者: 杨木发
版权声明:
本文为博主倾情原创文章,整篇转载请附上源文链接!
如果觉得本文对你有所收获,你的请评论点赞 与
合理优质的转发也将是鼓励支持我继续创作的动力,
更多精彩可百度搜索 杨木发 或:
个人网站: www.yangmufa.com ,
开源中国: https://my.oschina.net/yangmufa ,
Gitee: https://gitee.com/yangmufa ,
GitHub: https://github.com/yangmufa 。
坚持创作 善于总结 开源共享 高质进步。
------------------- 反爬声明o(*▽*)咻咻咻 -------------------- */