1.链表也是一种数据结构
对比与之前的数组来说,数组的元素地址是连续的,增删改查比较麻烦,处理元素不够灵活。
#include<stdio.h>
struct Test {
int data;
struct Test *next;
};
int main()
{
struct Test t1 = {1,NULL};
struct Test t2 = {2,NULL};
struct Test t3 = {3,NULL};
t1.next = &t2;
t2.next = &t3;
printf("%d %d %d\n",t1.data,t1.next->data,t1.next->next->data);
return 0;
}
2.链表遍历
void printTest(struct Test *head)
{
struct Test *point;
point = head;
while(point != NULL)
{
if(point != NULL)
{
printf("%d ",point->data);
point = point->next;
}
}
}
3.统计链表个数
int countTest(struct Test *p)
{
int cnt;
while(p != NULL)
{
if(p != NULL)
{
cnt++;
p = p->next;
}
}
return cnt;
}
4.查找链表元素
int searchTest(struct Test *t,int data)
{
while(t != NULL)
{
if(t->data == data)
{
return 1;
}
t =t->next;
}
return 0;
}
5.从对应节点后方插入新元素
int insertTestforbehind(struct Test *head,int data,struct Test *new)
{
struct Test *point;
point = head;
while(point != NULL)
{
if(point->data == data)
{
new->next = point->next;
point->next = new;
return 1;
}
point = point->next;
}
return 0;
}
new->next = point->next;
point->next = new;
需要先指向原先数组的下一项,不能颠倒,否则下一项没有东西可以指向。
6.从对应节点前方插入新节点:从头节点;从中间节点
struct Test* insertTestforhead(struct Test *head,int data,struct Test *new)
{
struct Test *p;
p = head;
if(p->data == data) //如果是在头部位置
{
new->next = p;
return new;
}
while(p->next != NULL) //头部下一个位置
{
if(p->next->data == data)
{
new->next = p->next;
p->next = new;
return head;
}
p = p->next;
}
return 0;
}
7.删除指定节点:头节点;中间节点
头节点:直接把头值赋给下一个
中间节点:绕过需要删除的节点,把下个地址直接赋值给下下个地址
struct Test* deleteNode(struct Test *head,int data)
{
struct Test *p;
p = head;
if(p->data == data)
{
head = head->next;
return head;
}
while(p->next != NULL)
{
if(p->next->data == data)
{
p->next = p->next->next;
return head;
}
p = p->next;
}
return head;
}