C语言实现单链表的基本操作

280 阅读2分钟

C语言实现单链表

头文件 reward.h


#define MAX_LENGTH  256 //避免链表过长,这里给链表长度做个限制

typedef struct _MYNODE{
    int node;
    struct _MYNODE* next;
} MY_NODE,* PT_MY_NODE;

PT_MY_NODE insert_node(PT_MY_NODE,int);

PT_MY_NODE remove_node_by_value(PT_MY_NODE,int);

PT_MY_NODE remove_node_by_index(PT_MY_NODE,int);

PT_MY_NODE  clear(PT_MY_NODE);

int output(PT_MY_NODE);

int find_by_index(PT_MY_NODE,int);

int count(PT_MY_NODE);

实现文件 reward.c


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "reward.h"

// 插入节点
PT_MY_NODE insert_node(PT_MY_NODE list,int item){
    PT_MY_NODE temp=(PT_MY_NODE)malloc(sizeof(MYNODE));
    temp->node=item;
    temp->next=list?list:NULL;
    list=temp;
    return list;
}

// 根据值删除节点
PT_MY_NODE remove_node_by_value(PT_MY_NODE list,int value){
    PT_MY_NODE temp;
    if(list->node==value){
        temp=list;
        list=list->next;
        free(temp);
    }
    PT_MY_NODE iterator=list;
    while(iterator){
        if(iterator->next&&iterator->next->node==value){
            temp=iterator->next;
            iterator->next=temp->next;
            free(temp)
        }
        iterator=iterator->next;
        
    }
    return list;
}

// 根据索引(下标)删除节点
PT_MY_NODE remove_node_by_index(PT_MY_NODE list,int index){
    PT_MY_NODE item=list;
    if(index==0){
        item=list;
        list=list->next;
        free(item);
    }else{
        int i=1;
        while(item&&item->next){
            PT_MY_NODE temp=item->next;
            if(index==i){
                item->next=temp->next;
                free(temp);
                break;
            }else{
                item=item->next;
                ++i;
            }
        }
    }
    return list;
}

// 清空列表
PT_MY_NODE  clear(PT_MY_NODE list){
    if(list){
        PT_MY_NODE temp=NULL;
        int i=0;
        while(list){
            temp=list;
            list=list->next;
            free(temp);
            ++i;
        }
    }
    return list;
}

// 根据索引(下标)查找,并返回值
int find_by_index(PT_MY_NODE list,int index){
    int i=0;
    PT_MY_NODE temp=list;
    while(temp&&index>i){
        temp=temp->next;
        ++i;
    }
    return temp->node;
}

// 输出打印链表
int output(PT_MY_NODE list){
    int i=0;
    if(list){
        PT_MY_NODE temp=list;
        while(temp&&i<=MAX_LENGTH){
            printf("list[%04d]=>%04d\n",i,temp->node);
            temp=temp->next;
            ++i;
        }
    }
    return i;
}

// 节点个数计数
int count(PT_MY_NODE list){
    PT_MY_NODE temp=list;
    int i=0;
    while(temp){
        temp=temp->next;
        ++i;
    }
    return i;
}

主程序

使用链表随机生成不重复的中奖号码


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "reward.h"
int main(void){
    PT_MY_NODE my_list=NULL;
    for(int i=1;i<109;++i){
        my_list=insert_node(my_list,i);
    }
    output(my_list);
    for(int i=0;i<3;++i){
        srand((unsigned)time(NULL)+i);
        int index=rand()%count(my_list);
        int value=find_by_index(my_list,index);
        printf("The [%03d] Number Persnal[%03d]\n",i+1,value);
        my_list=remove_node_by_index(my_list,index);
    }
    my_list=clear(my_list);
    return 0;
}