链表
Linklist.c
#include <stdio.h>
typedef struct node{
struct node *next;
// Plist next; //err,程序顺序执行,此时编译器还不认识Plist
//List *next; //err,理由同上
}List,*Plist;
Plist create_list() //创建链表头
{
Plist p=malloc(sizeof(List)); //创建头节点
p->next=NULL; //避免野指针的出现
return p;
}
int insert_head(Plist P) //链表插入(头插法)
{
Plist q=malloc(sizeof(List)); //新建一个要插入的节点
q->next=p->next; //17、18行不能交换顺序,否则会造成内存泄漏
p->next=q;
return 0;
}
//尾插法
int insert_tail(Plist p)
{
if(NULL==p) //判断指针是否有指向
return -1;
while(p->next!=NULL) //找出尾指针,相当于在遍历链表,但最后指针指向尾指针而不是NULL
{
p=p->next;
} //while(p->next=p->next->next)//可阅读性不好
//类似于while(i=i+1)即while(i++)
Plist q=malloc(sizeof(List)); //开辟一个新的节点用于插入尾部
if(NULL==q) //新节点是否开辟成功
{
perror("malloc");
return -1;
}
q->next=p->next; //新的节点指向p->next(NULL) //q->next=NULL
p->next=q; //原来尾节点的next指向新节点
return 0;
}
int delete_pos(Plist p,int pos)
{
if(NULL==p) //应该通过链表的节点数判断pos是否合理,暂时不考虑
{
puts("arg err");
return -1;
}
while(--pos) // --pos !!!!不是pos--因为删除一个节点,p应该在其上一个节点
{
p=p->next;
}
Plist q=p->next; //定义一个指针记录要删除的节点
p-next=q->next; //p->next=p->next->next
free(q); //释放删除节点的空间
return 0;
}
int main()
{
Plist p=crete_list();//创建链表头,一般链表头不存数据
insert_head(p);
insert_head(p);
insert_head(p);
insert_head(p);
deleted_pos(p,2);
return 0;
}
17、18行:
while(p):遍历链表
while(p->next)
{p=p->next;} : 找尾插的地址 // while(p->next==p->next->next)类似于:while(i=i+1)
链表(存数据版)
Linklist.h
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data; //数据区
struct node *next; //地址区
}List, *Plist;
Plist create_list(); //创建头节点
int insert_head(Plist p, int data); //头插
int insert_tail(Plist p, int data); //尾插
int delete_data(Plist p, int data); //删除
int change_data(Plist p, int src_data, int dst_data); //将p链表中所有的src_data改为dst_data
Plist select_data(Plist p, int data); //根据值查找链表中第一个出现的节点的地址
int empty_list(Plist p); //判断链表是否为空
void show(Plist p); //show出链表中所有元素
Linklist.c
#include <stdio.h>
#include <stdlib.h>
#include "Linklist.h"
/*
typedef struct node{
int data; //存储的数据
struct node *next;
}List, *Plist;*/
Plist create_list() //创建链表头
{
Plist p = malloc(sizeof(List));
if(NULL == p){
perror("create malloc");
return NULL;
}
p->next = NULL; //防止野指针
return p;
}
int insert_tail(Plist p, int data) //尾插
{
if(NULL == p){
puts("head insert arg err");
return -1;
}
while(p->next)
p = p->next;
Plist q = malloc(sizeof(List));
if(NULL == q){
perror("insert malloc err");
return -1;
}
q->data = data; //数据赋值
q->next = p->next; //q->next = NULL;
p->next = q;
return 0;
}
int delete_data(Plist p, int data)
{
}
int change_data(Plist p, int src_data, int dst_data)
{
if(NULL == p)
{
puts("change arg err");
return -1;
}
while(p->next)
{
if(p->next->data == src_data) //判断是否是一个要修改的节点
{
p->next->data = dst_data;
}
p = p->next; //指针向后移动一位
}
return 0;
}
Plist select_data(Plist p, int data)
{
}
int empty_list(Plist p) //判断链表是否为空
{
if(NULL == p){
puts("empty arg err");
return -1;
}
if(NULL == p->next)
return 1;
else
return 0;
}
void show(Plist p) //show出链表中所有元素
{
if(NULL == p || empty_list(p)){
return ;
}
p = p->next; //忽略掉头节点未赋值的数据0
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
puts("");
}