阿涛,你要认真对待每一件事,你要潇洒,要做自己!
链表定义:链表说白了是一种structure,一般包含一些数据,和一个指针。指针相当于一根绳子,指向下一个节点,将前后节点连接起来。
链表结构如下:
struct list
{
int age;
char myChar;
float myFloat;
......
struct list* next;
};
链表的静态创建:
静态我理解为是在代码中定义确定数量的节点的链表。并且创建后一直存在于内存中,除非手动free掉。
代码如下:
void setList()
{
struct list a,b,c,*head;
a.age=8;
b.age=9;
c.age=10;
head=&a;
a.next=&b;
b.next=&c;
c.next=NULL;
do
{
printf("%d\n",head->age);
head=head->next;
}while(head!=NULL);
}
NULL需要define NULL 0; 这个函数输出的是自己设置的节点的age值。
链表的动态创建:
动态我理解为创建的节点不确定,根据需要自己增加节点,比如手动输入每个节点的内容。输入多少个节点的内容就创建几个节点。
代码如下:
#define LEN sizeof(struct list)
struct list* getHead()
{
int n=0;
struct list*head,*p1,*p2;
head=NULL;
p2=NULL;
p1=malloc(LEN);
printf("your age,sir.\n");
scanf("%d",&p1->age);
while(p1->age!=0)
{
n+=1;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=malloc(LEN);
printf("your age,sir.\n");
scanf("%d",&p1->age);
p2->next=NULL;
}
return head;
}
申请内存空间需要malloc函数。
需要三个指针,一个头指针,记录链表的首个节点地址。
p1用来不断的申请新的节点,p2用来记录p1申请的前个节点。
当输入age值为0的时候停止创建节点。最终返回的是头节点指针。
链表中节点的删除:
我自己现在学到的是将要删除的节点断开,让其前一节点和后一节点连接起来。可是这里我有一个疑问,这样做的话只是将该节点断开了呀,这样能算删除吗?它所占的空间释放了吗?望各位指导一下!那我就简单的写出自己的理解吧!
通过一个链表的头结点,和要删除的一个节点的数据来实现。
代码如下:
void deleteDot(struct list* head,int num)
{
if(head==NULL)
{
return;
}
else
{
struct list* p1,*p2;
p1=head;
while(p1->age!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->age==num)
{
if(p1==head)
head->next=p1->next;
else
p2->next=p1->next;
free(p1);
printf("%d,has been deleted!\n",num);
}
else
{
printf("Not found! 404\n");
}
}
}
开始先判断是否是空链表,如果是则返回,不做处理。
如果不是空链表,则设置两个链表类型的指针p1,p2,
首先将传入的链表头指针head,赋予p1,产看要删除的节点是不是第一个,若是,则头指针的next是p1的next。
若不是第一个节点,则用p2代替p1,p1则去寻找下一个节点,然后在判断当前的p1的值是不是要删除点的值,若不是继续寻找下一节点。知道找到该节点,然后将p2的next指向p1的next.这样就把要删除的节点断开了。然后free()掉。
链表的插入:
链表的插入和删除很相似,都需要两个辅助链表类型指针。原理也是和删除一样,一个用于寻找下一个节点,一个用于记录找到的上一个节点。在两者之间插入,或者在头指针处插入,或者在末尾插入。
代码如下:
void insertDot(struct list * head,struct list *dot)
{
struct list * p0,*p1,*p2;
p0=dot;
p1=head;
p2=NULL;
if(head==NULL)
{
head=p0;
head->next=NULL;
}
else
{
while(p1->age<p0->age&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->age>=p0->age)
{
if(p1==head)
{
head=p0;
p0->next=p1;
}
else
{
p2->next=p0;
p0->next=p1;
}
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
do
{
printf("%d\n",head->age);
head=head->next;
}while(head!=NULL);
}