动手敲代码——链表(C语言实现)

已经经过测试,放心可用。
刚刚想起,前几天看的一篇文章说,链表用递归实现更简介,没有当时很奇怪,但是也没有深究,文中是用java实现的。最近比较忙,等有空我也来试试。

/*链表的简单操作*/ 

#include <stdio.h>
#include <stdlib.h>

#define OK    1
#define ERROR 0

int num = 0;

typedef struct Node
{
    int data;
    struct Node * next;
}Node;
typedef struct Node * LinkList;

/*初始化链表,生成头结点*/ 
int InitList(LinkList * L)
{
    *L = (LinkList)malloc(sizeof(Node)); 
    if(*L == NULL)
        return ERROR;
    (*L)->next = NULL;

    return OK;
} 

/*创建一个有n个节点的链表,尾插法*/ 
void CreatList(LinkList *L,int n)
{
    LinkList p = NULL,q = NULL;

//  *L = (LinkList)malloc(sizeof(Node));
    p = *L;
    while(n--)
    {
        q = (LinkList)malloc(sizeof(Node));
        p->next = q;
        q->data = num++;
        p = q;
    }
    p->next = NULL; 
} 

/*在链表的第n个节点后插入一个节点*/
void InsertNode(LinkList *L,int n)
{
    LinkList p = NULL,q = NULL;

    q = (LinkList)malloc(sizeof(Node));
    q->data = 100;
    p = (*L);
    while(n--)
    {
        p = p->next;
    }
    q->next = p->next;
    p->next = q;
} 

/*删除第n个节点*/
void DelectNode(LinkList *L ,int n)
{
    LinkList p = NULL,q = NULL; 

    p = *L;
    n--;
    while(n--)
    {
        p = p->next; 
    }
    q = p;
    p = p->next;
    q->next = p->next;
    free(p);
    p = NULL;
}

/*将表置空*/
void ClearList(LinkList *L)
{
    LinkList p = NULL,q = NULL;

    p = (*L)->next;
    while(p->next != NULL)
    {
        q = p;
        free(p);
        p = NULL;
        p = q->next;
    } 
    (*L)->next = NULL;   
} 

/*遍历链表*/
void PrintList(LinkList L)
{
    LinkList p = NULL;

    p = L->next;
    while(p->next != NULL)
    {
        printf(" %d ",p->data);
        p = p->next;
    }
    printf(" %d ",p->data);
} 

int main(void)
{
    LinkList L;

    InitList(&L);
    printf("\n创建链表\n");
    CreatList(&L,10);
    PrintList(L);
    printf("\n插入\n");
    InsertNode(&L,5);
    PrintList(L);
    printf("\n删除\n");
    DelectNode(&L,6);
    PrintList(L);
    printf("\n清空链表\n");
    ClearList(&L);
    PrintList(L);
}

以下为测试
测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值