C语言模拟单向链表

来源:互联网 发布:期权模拟交易软件 编辑:程序博客网 时间:2024/06/11 08:28
Main.c文件:#include <stdio.h>#include <stdlib.h>#include "myList.h"/* *author:Ryze *date:2016/11/26 21:50 *introduce:模拟单向链表 */int main(int argc, char *argv[]){    //创建node    Node *list = createList();    //添加元素    append(1,list);//0    append(2,list);//1    append(3,list);//2    append(4,list);//3    append(5,list);//4    //遍历列表    printf("----------添加后的列表---------\n");    traverse(list);    //插入数据    insert(3,0,list);    //遍历node    printf("----------插入后的列表---------\n");    traverse(list);    //删除一个节点    del(3,list);    //再次遍历node    printf("----------删除后的列表---------\n");    traverse(list);    return 0;}myList.h文件:#ifndef myLIST_H#define myLIST_H#endif // myLIST_H//定义节点类型typedef struct Node{    int data;//数据域    struct Node *next;//指针域}Node;//声明myList常用函数Node *createList();//建立一个节点void append(int num, Node *l);//向链表末尾添加数据void insert(int index, int num, Node *l);//向列表的指定位置插入数据void del(int index, Node *l);//删除列表中指定位置的数据void traverse(Node *l);//遍历ListmyList.c文件:#include <stdio.h>#include <stdlib.h>#include "myList.h"//建立一个列表Node *createList(){    //创建一个头节点    Node *head = malloc(sizeof(Node));//创建一个头节点    head->data = NULL;    head->next = NULL;    return head;//返回头节点}//向列表中添加数据void append(int num,Node *l){    Node *temp = l;    Node *end = NULL;    while(temp=temp->next){        end = temp;        //printf("节点地址为:%p\n",temp);    }    Node *node = malloc(sizeof(Node));    node->data = num;    node->next = NULL;    //若是第一个节点,则直接添加到头节点后面    if(end == NULL)    {        l->next = node;    //否则添加到最后一个节点后面    }else{        end->next = node;//将节点连接起来    }}//向列表的指定位置插入数据void insert(int index, int num, Node *l){    //创建待插入的节点,并初始化指定数值    Node *node = malloc(sizeof(Node));    node->data = num;    int i = 0;//将i初始化为-1    Node *temp = l;    //定义插入点的前一个节点和后一个节点    Node *befor, *after;    while(temp = temp->next)    {        //寻找前后的节点        //开始的第一个节点的下标为0        if(i == index - 1)        {            befor = temp;        }        if(i == index)        {            after = temp;            break;        }        i++;    }    //判断插入点是否为列表最后    if(after == NULL)    {        append(num,l);    }else{        //修改连接关系        befor->next = node;        node->next = after;    }}//删除列表中指定位置的数据void del(int index, Node *l){    int i = 0;    Node *temp = l;    //定义删除点的节点,前一个节点,后一个节点    Node *befor, *current, *after = NULL;    //查找指定位置的数据    while(temp = temp->next)    {        if(i == index - 1)        {            befor = temp;        }        if(i == index)        {            current = temp;        }        if(i == index + 1)        {            after = temp;            break;        }        i++;    }    //修改连接关系    befor->next = after;    free(current);}//遍历列表void traverse(Node *l){    Node *temp = l;    int i = 0;    while((temp = temp->next) != NULL)    {        printf("第%d个节点的值为   ---- %d\n",i,temp->data);        i++;    }}执行结果:

这里写图片描述

0 0
原创粉丝点击