C语言-用单链表实现集合

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

//单链表结构体表示集合set
typedef struct Link {
    char *data;
    struct Link *next;
} set;

//带头节点的单链表
set *initSet()
{
    set *p;
    if((p = (set *)malloc(sizeof(set))) == NULL) {
        printf("Error: initSet: malloc failed!\n");
        return NULL;
    }

    p->next = NULL;

    return p;
}

//默认每次都是头部添加
int addSet(set *l, char *value)
{
    set *p;
    int len;

    if((p = (set *)malloc(sizeof(set))) == NULL) {
        printf("Error: addSet: malloc failed!\n");
        return 0;
    }

    while(l->next) {
        if(0 == strcmp(value, l->next->data)) {
            printf("Error: addSet: %s - already in set, duplicate add!\n", value);
            free(p);
            return 0;
        }
        l = l->next;
    }

    p->data = value;
    p->next = l->next;
    l->next = p;

    return 1;
}

int delSet(set *l, char *value)
{
    set *p = l;
    while(p->next) {
        if(0 == strcmp(value, p->next->data)) {
            set *temp = p->next;
            p->next = p->next->next;
            free(temp);
            return 1;
        }
        p = p->next;
    }

    printf("Warn: delSet: not found - %s - in set!\n", value);
    return 0;
}

int updateSet(set *l, char *oldValue, char *newValue)
{
    set *p = l;
    while(p->next) {
        if(0 == strcmp(oldValue, p->next->data)) {
            p->next->data = newValue;
            return 1;
        }
        p = p->next;
    }

    printf("Warn: updateSet: not found - %s - in set!\n", oldValue);
    return 0;
}

int findSet(set *l, char *value)
{
    set *p = l;
    while(p->next) {
        if(0 == strcmp(value, p->next->data)) {
	    printf("Info: findSet: found - %s - in set!\n", value);
            return 1;
        }
        p = p->next;
    }

    printf("Warn: findSet: not found - %s - in set!\n", value);
    return 0;
}

//debug func
void displaySet(set *l) {
    set *p = l->next;
    while (p!=NULL) {
		printf("--%s--\n", p->data);
		p = p->next;
    }
}

//使用单链表实现集合
//要求:
// add - 参数 (set,value),value表示要增加的元素值,需要做去重
// del - 参数 (set,value),value表示要删除的元素值
// modify - 参数(set,oldValue, newValue),将集合内oldValue的值修改为newValue
// find - 参数 (set, value),查找集合内是否存在元素value
int main() {

    set *p;
    int ret = 0;

    printf("------init-------\n");
    p = initSet(); //初始化一个空集合
    displaySet(p);
    printf("\n");
    printf("-------add-------\n");
    ret = addSet(p, "asdf0");
    ret = addSet(p, "asdf1");
    ret = addSet(p, "asdf2");
    ret = addSet(p, "asdf3");
    displaySet(p);
    ret = addSet(p, "asdf1");
    printf("\n");
    printf("\n");
    displaySet(p);
    printf("-------del---asdf2----\n");
    ret = delSet(p, "asdf2");
    printf("\n");
    printf("\n");
    displaySet(p);
    printf("-------update---asdf2/3-->22/33--\n");
    ret = updateSet(p, "asdf2", "asdf22");
    ret = updateSet(p, "asdf3", "asdf33");
    printf("\n");
    printf("\n");
    displaySet(p);
    printf("-------find---asdf100/1----\n");
    ret = findSet(p, "asdf100");
    ret = findSet(p, "asdf1");

//    displaySet(p);

    return 0;
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值