C语言链表

C语言链表是一个很有用的东西,它在不连续存储的情况下极大效率利用了内存。不过要理解C语言链表不是一个很容易的事情。在操作链表的过程中的中心思想是我们只保存链表的头部,后边的操作都是获取到头部之后进行链表的增删,对链表头部本身那个变量是不动的。

从最简单的单向表开始:

单向表的结构如图:(图片来自百度)

 

 

单向表只有两个元素:数据和下一个节点,结构如下:

typedef struct st 
{
    int data;
    struct st * next;
}NODE;
单相表只有一个表头,表上最后一个元素指向NULL。
创造一个链表:
NODE * createNODE(int n)
{
    NODE *h , *node , *e;
    h = (NODE*)malloc(sizeof(NODE));
    e = h;
    for(int i = 0 ; i < n ; i ++)
    {
        node = (NODE*)malloc(sizeof(NODE));

        node->data = i;
        e->next = node;
        e = node;
    }
    e->next = NULL;
    return h;
}   

改变链表里面的元素:

void changeNODE(NODE *list , int n , int data)
{
    NODE *t = list;
    int i;
    while((i < n ) && t != NULL)
    {
        t = t->next;
        i ++;
    }
    if(t != NULL)
    {
        t->data = data;
    }
    else 
    {
        puts("节点不存在");
    }
}

删除链表里的某个节点:

void deleteNODE(NODE *list, int n )
{
    NODE *t = list , *in;
    int i = 0;
    while((i < n ) && t != NULL)
    {
        in = t ; 
        t = t->next;
        i ++;
    }
    if(t != NULL)
    {
        in->next = t ->next;
        free(t);
    }
    else 
    {
        puts("节点未打开");
    }
}

在链表上插入节点:

void insertNODE(NODE *list , int n , int data)
{
    NODE *t = list , *in;
    int i= 0;
    while((i < n ) && t != NULL)
    {
        t = t -> next;
        i ++;
    }
    if(t != NULL)
    {
        in = (NODE*)malloc(sizeof(NODE));
        in->data = data;
        in->next = t->next;
        t->next = in ->next;
    }
    else
    {
        puts("节点不存在");
    }
}

打印链表元素:

void showNODE(NODE *h)
{
    NODE *t;
    t = h;
    while(t != NULL)
    {
        printf("%d " , t->data);
        t = t -> next;
   }
   printf("\n");
}

在使用链表的时候要保证头部不变:

int main(int argc ,char **argv)
{
    const NODE *c; // 这是链表头部
    c = createNODE(5);
    showNODE(c);
    changeNODE(c,2,333);
    showNODE(c);
    deleteNODE(c , 4);
    return 1;
    
}

单向链表就这么简单。

 
 

posted on 2019-05-29 14:39  xcbb  阅读(224)  评论(0)    收藏  举报

导航