リストに示された位置に出力ノードを削除します

/*************************************************************************
	> File Name: 3.list.cpp
	> Author: 
	> Mail: 
	> Created Time: 2020年02月13日 星期四 14时34分45秒
 ************************************************************************/

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


typedef struct lnode{
    int data;
    struct lnode *next;
}Listnode;

typedef struct lst{
    Listnode head;
    int length;
}List;

Listnode *getNewNode(int val){
    Listnode *node = (Listnode *)malloc(sizeof(Listnode));
    node->data = val;
    node->next = NULL;
}

List *init(){
    List *l = (List *)malloc(sizeof(List));
    l->head.next = NULL;
    l->length = 0;
    return l;
}

int insert(List *l, int ind, int val){
    if(l == NULL) return -1;
    if(ind < 0 || ind > l->length) return 0;
    int ret = ind;
    Listnode *p = &(l->head), *node = getNewNode(val);
    while(ind--) p = p->next;
    node->next = p->next;
    p->next = node;
    l->length++;
    return ret;
}

int delete_node(List *l, int ind){
    if(l == NULL) return -1;
    if(ind < 0 || ind >= l->length) return -1;
    int ret = ind;
    Listnode *p = &(l->head), *q;
    while(ind--) p=p->next;
    q = p->next;
    p->next = q->next;
    free(q);
    l->length--;
    return ret;
}
/*
int search(List *l, int val){
    int ind = 0;
    Listnode *p = l->head.next;
    while(p && p->data != val) p=p->next, ind++;
    if(ind == l->length) return -1;
    return ind;
}
*/

void output_pointer(List *l, int ind){
    char str[100];
    int offset = 3;
    Listnode *p = l->head.next;
    while(ind != -1 && p != NULL){
        offset += sprintf(str, "%d->", p->data);
        ind -= 1;
        p = p->next;
    }
    for(int i = 0;i < offset; i++) printf(" ");
    printf("^\n");
    for(int i = 0; i < offset; i++) printf(" ");
    printf("|\n\n");
    return ;
}

void output(List *l){
    printf("head->");
    for(Listnode *p = l->head.next; p; p=p->next){
        printf("%d->", p->data);
    }
    printf("NULL\n");
    return;
}

void clear_node(Listnode *node){
    if(node == NULL)return ;
    free(node);
    return ;
}

void clear_list(List *l){
    if(l == NULL) return;
    Listnode *p = l->head.next, *q;
    while(p){
        q = p->next;
        clear_node(p);
        p = q;
    }
    free(l);
    return;
}

int main(){
    srand(time(0));
    #define max_op 20
    List *l = init();
    int op, ind, val, flag;
    for(int i = 0; i < max_op; i++){
        op = rand() % 4;
        ind = rand() % (l->length + 3) - 1;
        val = rand() % 100;
        switch(op){
            case 0:
            case 1:
            case 2:{
                printf("insert %d at %d to List\n", val, ind);
                flag = insert(l, ind, val);
            }break;
            case 3:{
                printf("delete item at %d from List\n", ind);
                flag = delete_node(l, ind);
            }break;
        }
        output(l);
        output_pointer(l, flag);
        printf("\n");
    }
    clear_list(l);
    return 0;
}

公開された48元の記事 ウォンの賞賛5 ビュー754

おすすめ

転載: blog.csdn.net/weixin_43899266/article/details/104297751