定义链表节点
typedef struct Node{
int value;
struct Node *next;
//指针名为next,指针指向的类型为一个叫Node的结构体
}node;
插入元素操作
1.非函数版本
int number;
cin>>number;
node*head=NULL;
/*↓↓创建一个新的链表节点 ↓↓*/
node*p=(node*)malloc(sizeof(node));
p->value=number;
p->next=NULL;
/*↓↓找到原链表的末端 ↓↓*/
node*last=head;
//一个指针,指向头部,即从头开始找
if(last){
while(last->next) last=last->next;
//只要last节点中的next所指向的不是NULL,就继续向后找
//具体操作:last更新为原来last中next所指向的地方
last->next=p;
//如果头部next所指非NULL,即链表末端串入新的链表节点
}
else head=p;
//如果头部next所指就是NULL
//则串入头部以外的第一个有实际数据的链表节点
2.函数版本
打印链表操作
1.非函数版本
node*p;
for(p=list.head;p;p=p->next)
printf("%d\t",p->value);
// \t表示敲一个TAB键
2.函数版本
//调用
print(&list);
//函数原型
void print(List *plist)
{
node*p;
for(p=plist->head;p;p=p->next)
printf("%d\t",p->value);
}
查找元素操作
1.非函数版本
scanf("%d",&number);
node*p;
int isFound=0;
for(p=list.head;p;p=p->next){
if(p->value==number){
printf("找到了\n");
isFound=1;
break;
}
}
删除元素操作
node*q;//用于辅助找到目标节点的前一个节点
for(q=NULL,p=list.head;p;q=p,p=p->next){
//中间的p排除p为NULL的情况
//但q不能被排除,但其特殊情况即为链表第一个就是目标节点
if(p->value==number){//找到目标节点
if(q) q->next=p->next;
//串接目标节点的前一个节点与后一个节点
else list.head=p->next;
free(p);
break;
}
}
链表清除操作
node*q;
for(p=head;p;p=q){
q=p->next;
free(p);
}