/*************************************************************************
> 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;
}
リストに示された位置に出力ノードを削除します
おすすめ
転載: blog.csdn.net/weixin_43899266/article/details/104297751
ランキング