欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言单链表简单实现(简单程序复杂化)

程序员文章站 2022-09-27 16:14:57
PS: goto还是很好玩的。 #include #include typedef struct _node{ int value; struct _node *next;} Node;typedef struct _list{ Node* head;}List;void add(List* pli... ......
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);
    } 
}

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