asuerhao's Blog

如果有什么做的不到的地方请尽管留言, 我会改进的 : )

结构体和动态内存分配实现的单向列表结构

asuerhao posted @ 2012年4月04日 21:11 in 积累 with tags c 单向链表 动态内存分配 , 1132 阅读

好像贴出这么多代码来现丑有些不合适,不过我是博主, 我说了算:

#include<stdio.h>
#include<stdlib.h>
struct one_way_list{
 	int data;
	struct one_way_list *next_node_pt;
}*head, *tail;  //定义结构体, 单向列表的一个结点.
int counter=0;  //计数器
//添加数据:
int app_data(int data) {
	if(counter==0){
		head=tail=(struct one_way_list *)malloc(sizeof(struct one_way_list));
		if(head==NULL){
			return(-1);
		}
		(*head).data=data;
	} else {
		(*tail).next_node_pt=(struct one_way_list *)malloc(sizeof(struct one_way_list));
		if((*tail).next_node_pt==NULL){
			return(-1);
		}
		tail=(*tail).next_node_pt;
		(*tail).data=data;
	}
	counter++;
	return(1);
}
//某数据是否存在:
int exists(int data) {
	if(counter==0){
		return(-1);
	} else {
		int i=0;
		struct one_way_list *pt=head;
		do{
			if((*pt).data==data) {
				return(i);
			}
			i++;
			pt=(*pt).next_node_pt;
		}while(pt != tail);
		return(-1);
	}
}
//查看计数器:
int count(void) {
	return(counter);
}
//查看列表头:
int head_data(void) {
	if(counter==0){
		return(-1);
	} else {
		return((*head).data);
	}
}
//查看列表尾:
int tail_data(void) {
	if(counter==0){
		return(-1);
	} else {
		return((*tail).data);
	}
}
//查看第i个数据:
int ith_data(int numth) {
	if(counter==0 || numth<0 || numth >= counter){
		return(-1);
	} else {
		int i=0;
		struct one_way_list tmp;
		tmp=*head;
		for(i=0; i!=numth; i++){
			tmp=*tmp.next_node_pt;
		}
		return(tmp.data);
	}
}
// 删除所有数据:
int delete_all(void) {
    struct one_way_list *pt=head;
    while(counter!=0) {
        pt=head;
        head=(*head).next_node_pt;
        free(pt);
        counter--;
    }
    return(1);
}
// 删除第i个数据:
int delete_ith(int numth) {
    if(counter==0 || numth<0 || numth>= counter) {
        return(-1);
    } else if(numth==0) {
        struct one_way_list *pt=head;
        head=(*head).next_node_pt;
        free(pt);
        return(1);
    } else {
        int i=0;
        struct one_way_list *pt_pr=head;
        struct one_way_list *pt=(*head).next_node_pt;
        for(i=1; i!=numth; i++) {
            pt_pr=(*pt_pr).next_node_pt;
            pt=(*pt).next_node_pt;
        }
        (*pt_pr).next_node_pt=(*pt).next_node_pt;
        free(pt);
        if(numth==counter) {
            tail=pt_pr;
        }
        return(1);
    }
}

//用于测试的主函数:
int main(void) {
	if(app_data(1) == -1){
		printf("Error1");
	}
	printf("counter: %d\n",counter);
	if(app_data(2) == -1){
		printf("Error2");
	}
	printf("counter: %d\n",counter);
	if(app_data(3) == -1){
		printf("Error3");
	}
	printf("counter: %d\n",counter);
	if(app_data(4) == -1){
		printf("Error4");
	}
	printf("counter: %d\n",counter);
	if(exists(1)>=0){
		printf("exits 1: %dth,\n", exists(1));
	} else {
		printf("1 not exits\n");
	}
	if(exists(9)>=0){
		printf("exits 9: %dth,\n", exists(9));
	} else {
		printf("9 not exits\n");
	}
	printf("count: %d\nhead: %d\ntail_data: %d\n", count(), head_data(), tail_data());
	printf("2th data:%d\n", ith_data(2));
    delete_all();
    printf("Just delete All.\n");
    if(app_data(7) == -1){
        printf("Error7");
    } else {
        printf("7 added\n");
    }
    printf("counter: %d\n",counter);
    if(app_data(6) == -1){
        printf("Error6");
    } else {
        printf("6 added\n");
    }
    printf("counter: %d\n",counter);
    if(app_data(5) == -1){
        printf("Error5");
    } else {
        printf("5 added\n");
    }
    printf("counter: %d\n",counter);
    if(delete_ith(1) == -1){
        printf("1th deleted error\n");
    } else {
        printf("1th deleted\n");
    }
    printf("1th: %d\n",ith_data(1));
    printf("head: %d\ntail: %d\n", head_data(), tail_data());
    return(0);
}
Avatar_small
net worth 说:
2023年12月07日 17:10

I learned a lot from the insight you shared here. It's good to learn more about this topic, and if you have some free time or you're curious about some celebrity basic information, you can visit idol net worth and search for it.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter