目录
创建链表节点结构体
typedef struct node
{
//struct node * prev;//上一个节点
int data;//数据域
struct node* next;//下一个节点
} Node, * PNode;
这里我们建的是一个单向链表
创建头节点和尾节点
PNode header;//头节点
PNode ender;//尾节点
创建节点 数据打包
进去的是数据,出来的是节点
PNode create(int data);
PNode create(int data)//进去的是数据,出来的是节点
{
PNode newNode = (PNode)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
连接链表
void add(PNode node);
void add(PNode node)
{
if (header == NULL)//空链表
{
header = ender = node;
}
else
{
ender->next = node;
ender = node;//让新的节点称为尾部节点
}
}
插入连接到链表
void insert_behind(int index, PNode node);
void insert_behind(int index, PNode node)
{
//理想的 中间插入
//1.找到插入点
PNode p = header;
for (int i = 0; i < index; i++)
{
p = p->next;
}
//2.插入连接到链表
node->next = p->next;
p->next = node;
}
删除节点
按下标删除节点:
void remove_index(int index);
void remove_index(int index)
{
//找到位置
PNode p = header;
PNode q = NULL;
for (int i = 0; i < index; i++)
{
q = p;
p = p->next;
}
if (p != NULL && q != NULL)
{
q->next = p->next;
free(p);
p = NULL;
}
}
按数据删除节点:
先要根据数据找到下标,在根据下标删除节点
寻找某数据的下标:
int indexOf(int data);
int indexOf(int data)
{
PNode p = header;
for (int i = 0; p != NULL; i++)
{
if (p->data == data)
{
return i;
}
p = p->next;
}
return -1;
}
删除节点:
void remove_data(int data);
void remove_data(int data)
{
int i = indexOf(data);
if (i >= 0)
{
remove_index(i);
}
}
链表查询
某下标的数据节点:
PNode get(int index);
PNode get(int index)
{
PNode p = header;
for (int i = 0; i < index; i++)
{
p = p->next;
}
return p;
}
某下标的数据:
int get_data(int index);
int get_data(int index)
{
PNode p = header;
for (int i = 0; i < index; i++)
{
p = p->next;
}
return p->data;
}
链表长度:
int size();
int size()
{
PNode p = header;
int count = 0;
while (p != NULL)
{
count++;
p = p->next;
}
return count;
}
遍历链表:
for (int i = 0, len = size(); i < len; i++)
{
PNode p = get(i);
printf("%d %d\n", p->data,get_data(i));
}