链表操作练习

//以下是list.h
#ifndef _LIST_H_
#define _LIST_H_

typedef struct _list{
char item[50];
struct _list *next;
}link_node;

typedef link_node *link_list;
int list_init(link_list *list);
int list_add_head(link_list *const head, const char *s);
int list_print(link_list *list,int begin, int num);
int list_add_tail(link_list* const head, const char *s);
int list_free( link_list* const list, const char *s);
int list_destroy(link_list* const list);
#endif

 

//以下是list.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "list.h"
link_list list;
link_list test;
int main(int argc, char*argv[])
{
    list_init(&list);
    list_add_tail(&list,"aaaa");
    list_add_head(&list,"bbbb");
    list_add_head(&list,"");
    list_add_head(&list,"cccc");
    list_add_tail(&list,"kkkk");
    list_print(&list,0,15);
    list_free(&list,"cccc");
    list_print(&list,0,15);
    list_destroy(&list);
    list_print(&list,0,15);
    list_free(&list," ");
    list_print(&list,0,15);
    list_init(&test);;
    list_add_head(&test,"test");
    list_print(&test,0,2);
    
    return 0;
}
int list_init(link_list* const list)
{
    *list = NULL;
    return 0;
}
int list_add_head(link_list* const head, const char *s)
{
    assert(s != NULL);
    assert(strlen(s) <= 50);
    link_list new_list;
    new_list = (link_list)malloc(sizeof(link_node));
    if(new_list == NULL)
        return -1;
    memset(new_list->item,0x0,sizeof(char[50]));
    strcpy(new_list->item,s);

    if((*head) == NULL)
    {
         (*head) = new_list;
         new_list->next = NULL;
    }
    else
    {
        new_list->next = (*head);
        *head = new_list;
    }
    return 0;
}
int list_add_tail(link_list* const head, const char *s)
{
    assert(s != NULL);
    assert(strlen(s) <= 50);
    link_list new_list;
    link_list p = (*head);
    while(p != NULL && p->next != NULL)
        p = p->next;
    new_list = (link_list)malloc(sizeof(link_node));
    if(new_list == NULL)
        return -1;
    memset(new_list->item,0x0,sizeof(char[50]));
    strcpy(new_list->item,s);
  
    if((*head) == NULL)
    {
         (*head) = new_list;
         new_list->next = NULL;
    }
    else
    {
        p->next = new_list;
        new_list->next = NULL;
    }
    return 0;
}
/*
    begin=0代表第一个节点
*/
int list_print(link_list *list,int begin, int num)
{
    link_list p = *list;
    int count = 0;
    while(p != NULL)
    {
        if(count >= begin && count <= num )
            printf("%s\n",(p)->item);
        p = p->next;
        if(count == num)
            break;
        count ++;
    }
    printf("(%d)\n",count);
    return 0;
}
int list_free( link_list* const list, const char *s)
{
    assert(s != NULL);
    assert(strlen(s) <= 50);
    if(*list == NULL)
    {
        printf("list donot exit");
        return -2;
    }
    link_list p = (*list);
    link_list temp ;
    while(p != NULL)
    {
        if(strcmp(s,p->item) == 0)
        {
            if(p == (*list)) //头结点,改变头指针
            {
                *list = p->next;
                free(p);
               return 0;//找到
            }
            else
            {
                temp->next = p->next;
                free(p);
                return 0;//找到
            }
        }
        temp = p;
        p = p->next;
    }
    return -1;//未找到
}
int list_destroy(link_list* const list)
{
    link_list p;
    link_list q;
    p = *list;
    while(p != NULL)
    {
        q = p;
        p = p->next;
        printf("destroy %s  \n",q->item);
        free(q);
    }
    *list = NULL;
    return 0;
} 
  

运行结果如下:

cccc
bbbb
aaaa
kkkk
(5)
bbbb
aaaa
kkkk
(4)
destroy   
destroy bbbb  
destroy aaaa  
destroy kkkk  
(0)
list donot exit(0)
test
(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值