【链表6】<最新>链表(link list)
链表的内存大小是动态的。当一个链表被创建时,如果没有存储任何内容,我们则希望这个链表最好不占用内存空间。 链表的节点可以自由删减。当我们需要向链表中存入一个数据时,这个链表的内存可以被动态增加以用于存放数据。当我们需要将链表中的某一个节点删除,这个链表的内存可以被动态地释放,防止无故坏死的内存块存在。 链表中的数据可以被检索,遍历。当我们需要在链表中查询某个元素的时候,链表可以快速地响应。 链表中的数据可以被快速插入。当我们需要向链表中某一个位置插入一个数据时,这个数据节点可以被快速地插入,而不需要像线性表一样,对整体数据进行移位,因为这会远远加重程序的时间复杂性。
typedef struct Node
{
int data;
struct Node *next;
} Node_t;
Node_t *node;
node_t *ll_pt;
ll_pt = (node_t *)malloc(sizeof(node_t));
#include<stdio.h>
#include<stdlib.h>
/*声明一个链表节点*/
typedef struct NODE
{
int data;
struct NODE *next;
}node_t;
node_t * ll_init(void);
node_t* ll_append(node_t *list, int data);
int ll_seek(node_t *list);
int ll_delete(node_t *list);
int main(void)
{
node_t *ll_pt = NULL;
ll_pt = ll_append(ll_pt, 1000);
ll_pt = ll_append(ll_pt, 2000);
ll_pt = ll_append(ll_pt, 3000);
ll_pt = ll_append(ll_pt, 4000);
ll_pt = ll_append(ll_pt, 5000);
ll_pt = ll_append(ll_pt, 6000);
ll_pt = ll_append(ll_pt, 7000);
ll_seek(ll_pt);
printf("\n Before free %d", ll_pt -> data);
ll_delete(ll_pt);
printf("\n After free %d", ll_pt -> data);
return 0;
}
int ll_delete(node_t *list)
{
node_t *p, *pr;
p = list;
while(p != NULL)
{
pr = p;
p = p -> next;
free(pr);
}
return 1;
}
int ll_seek(node_t *list)
{
node_t *p;
p = list;
int i;
while(p != NULL)
{
printf("%d:%d | ", i, p -> data);
p = p -> next;
i ++;
}
return 1;
}
node_t* ll_append(node_t *list, int data)
{
node_t *p = NULL, *head, *pr;
head = list;
p = (node_t *)malloc(sizeof(node_t));
if(p == NULL)
{
/*申请返回NULL,申请错误*/
}
if(list == NULL) //如果此时的List为NULL,则对List进行初始化
{
head = p;
head->data = data;
head->next = NULL;
}
else //否则,就追加新的节点
{
pr = head;
while(pr->next != NULL) //找到最后一个节点
{
pr = pr -> next;
}
pr->next = p; //当前的next指针指向新节点
p->data = data;
p->next = NULL; //新节点的next指针指向NULL
}
return head;
}
赞 (0)