#include "list.h"
/*
typedef struct _node{
int value;
struct _node *next;
}Node;
typedef struct _node{
Node *head;
}List;
*/
//添加节点
void add(List *plist,int number){
//add to linked_list
Node *p=(Node*)malloc(sizeof(Node));//*p指针用于暂存,创建的一个链表节点的结构体的指针
p->value=number;//往结构体中赋值
p->next=NULL;//结构体中赋上下一个节点的地址,一开始先按 NULL处理
//find the last
Node *last=plist->head;//第一步先创建一个指向链表尾的指针。把链表头和尾指向一起
if(last==NULL){
plist->head=p;//第二部把头指向创建的第一个节点
}
else{
//attch
last->next=p;//第三步指向最新创建的节点
while(last->next){
last=last->next;
}
}
}
//输出所有节点
void outvalue(List *list){
Node *p;
//遍历一个链表的经典写法
for(p=list->head;p;p=p->next){
printf("%d\n",p->value);
}
}
//找出节点中与输入值匹配的节点,并输出其值
void list_getnode(List *list){
int number;
scanf("%d",&number);
Node *p;
int isfound=0;
for(p=list->head;p;p=p->next){
if(p->value==number){
printf("%d\n",p->value);
isfound=1;
break;
}
}
if(!isfound){
printf("没找到\n");
}
}
//删除与输入值相等的节点
void delect_node(List *list){
int number;
scanf("%d",&number);
Node *p;
Node *q;
q=NULL;
//所有在 ->左边的指针都必须保证其安全
for(p=list->head;p;p=p->next){
if(p->value==number){
if(q){
q->next=p->next;
}else{
list->head=p->next;
}
free(p);
break;
}
}
}
//删除所有节点
void delect_allnode(List *list){
Node *p;
Node *q;
//清楚整个链表
for(p=list->head;p;p=q){
q=p->next;
free(p);
}
}
void list1(void){
List list;
list.head=0;//结构体,包含一个指向链表头节点的结构体的指针
int number;
do{
scanf("%d",&number);
if(number!=-1){
add(&list,number);
}
}
while(number!=-1);
outvalue(&list);
list_getnode(&list);
delect_node(&list);
delect_allnode(&list);
}
03-31
1294
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
01-31
202
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)