struct Listnode{
int data;
struct Listnode *next;
};
通过尾插法创建一个链表
struct Listnode *create(){
struct Listnode *head = (struct Listnode*)malloc(sizeof(struct Listnode));
struct Listnode *t = head,*n = NULL;
//头节点尾节点新节点的定义
int data;
scanf("%d",&data);
while (data != 0) {
n = (struct Listnode*)malloc(sizeof(struct Listnode));
n->data = data;
t->next = n;
t = n;
scanf("%d",&data);
}
return head->next;
}
最后返回了head->next,让最后得到的链表第一个节点就有元素,如果不需要这个功能,可以返回head
链表的遍历输出函数
void display(struct Listnode *head){
while (head != NULL) {
printf("%d ",head->data);
head = head->next;
}
printf("\n");
return;
}
需要第一个节点就带有数据的链表,如果需要传入第一个节点不含有数据的链表,则在函数的第一行加上head = head->next
向链表的头部插入一个数据
struct Listnode* head_insert(struct Listnode *head,int data){
//向链表的头部插入一个数据
struct Listnode *neew = (struct Listnode*)malloc(sizeof(struct Listnode));
neew->data = data;
neew->next = head;
return neew;
}
调用语句为 head = head_insert(head,1)
向链表的头部插入一个数据
返回插入之后的链表的头节点并更新被操作的链表
void head_insert(struct Listnode *head,int data,struct Listnode **p){
//向链表的头部插入一个数据
struct Listnode *neew = (struct Listnode*)malloc(sizeof(struct Listnode));
neew->data = data;
neew->next = head;
*p = neew;
}
调用语句为 head_insert(head,1,&data)
两者实现的功能完全一样,传递参数的不同造成了调用方式的不同,看懂第二种对理解指针有莫大的意义
删除某一个节点
void node_del(struct Listnode *prenode){
struct Listnode *tmp = prenode->next;
prenode->next = prenode->next->next;
free(tmp);
}
必须传入一个节点的前置节点