设为首页 加入收藏

TOP

C语言单链表简单实现(简单程序复杂化)
2019-09-23 18:10:29 】 浏览:58
Tags:语言 单链表 简单 实现 程序 复杂化
PS: goto还是很好玩的。 
#include <stdio.h>
#include <stdlib.h>

typedef struct _node{
    int value;
    struct _node *next;
} Node;
typedef struct _list{
    Node* head;
}List;

void add(List* plist,int number);
void print(List* list);
void deletel(List* list,int number);
void freel(List* list);

int main(int argc, char *argv[]) {
    Node *head = NULL;
    List list;
    int number=0;
    list.head=NULL;
    for(;;){
    printf("\n这是一个链表,现有如下功能  1.添加节点  2.遍历链表  3.查找并删除节点  4.释放链表 5.退出程序 \n请输入你想要进行的操作的选项:\n" ); 
    out:
    scanf("%d",&number);
    switch(number){
        case 1:
            printf("你选择了添加节点\n请输入添加节点的值,输入-1结束添加\n");
            do{
                scanf("%d",&number);
                if(number != -1){
                    //添加一个新的节点挂载。 
                    add(&list,number);
                }
            }while(number != -1);
            printf("添加完毕");             
            break; 
        case 2:
            printf("你选择了遍历链表\n");
            //打印链表 
            print(&list); 
            break; 
        case 3:
            printf("你选择了查找并删除节点,请输入节点数据\n");
            scanf("%d",&number);
            //删除一个节点 
            deletel(&list,number); 
            break; 
        case 4:
            printf("你选择了释放链表");
            //释放链表 
            freel(&list); 
            printf("释放完毕"); 
            break; 
        case 5:
            goto end; 
        default :
            printf("输入错误,请重新输入\n");
            goto out;
        }
    }
    end:
    printf("拜拜"); 
    return 0;
}
void add(List* plist,int number){
    Node *p =(Node*)malloc(sizeof(Node));
    p->value =number;
    p->next =NULL;
    Node *last =plist->head;
    if(last){
        while(last->next){
            last = last->next;
        }
        last->next=p;
    }else{
        plist->head = p;
    }
}
    //遍历链表 
void print(List* list){
    Node *p;
    for(p=list->head;p;p=p->next){
        printf("%d\t",p->value);
    }
    printf("\n");
}
    //查找并删除节点
void deletel(List* list,int number){
    Node* p;
    int isFound =0;
    for(p=list->head;p;p=p->next){
        if(p->value==number){
            printf("找到了\n");
            isFound = 1;
            break ; 
        }
    }
        if(!isFound){
        printf("没找到"); 
        }
        Node *q;
    for(q=NULL,p=list->head;p;q=p,p=p->next){
        if(p->value==number){
            if(q){
            q->next = p->next;
        }else{
            list->head=p->next;
        }
            free(p);
            printf("已经删除"); 
            break ;
        }
    } 
}
    //释放链表 
void freel(List* list){
    Node *q;
    Node* p;
    for(p=list->head;p;p=q){
    q=p->next;
    free(p);
    } 
}

读书和健身总有一个在路上

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇操作符重载(二) 下一篇C++类的this指针详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目