您的位置:首页 > 理论基础 > 数据结构算法

数据结构之链表学习心得

2016-05-01 10:02 543 查看
      顺序表从节点之间的链接方式分我连续空间顺序表和链式顺序表,前者的实现就是在普通数组上做了封装,后者实现就是前一个节点保存后一个节点的地址。本文讨论的就是后者,链式顺序表的一个最明显的特征,就是在增减,插入,排序,遍历等操作中有更好的效率,这些操作的有一个共同的核心思想,就是对链表节点进行重新排序。添加节点到一个链表,有头插法和尾插法之分,前者就能实现一个插入顺序的逆置,实现代码:

#include <stdio.h>

#include <stdlib.h>

typedef int DATATYPE;

typedef struct Node{
DATATYPE data;
struct Node *next;

}LinkNode;

LinkNode *create_linklist()

{
LinkNode * head = (LinkNode *)malloc(sizeof(LinkNode));
head->next = NULL;
return head;

}

//头插法

void insert_head_linklist(LinkNode *head, DATATYPE data)

{
LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));
node->data = data;
node->next = head->next;
head->next = node;

}

//尾插法

void insert_tail_linklist(LinkNode *head,DATATYPE data)

{
LinkNode *Node = (LinkNode *)malloc(sizeof(LinkNode));
LinkNode *p = head;
Node->data = data;
while(p->next){
p=p->next;
}
Node->next = NULL;
p->next = Node;

}

//按数据大小顺序插入

void insert_order_linklist(LinkNode *head, DATATYPE data)

{
LinkNode *Node = (LinkNode *)malloc(sizeof(LinkNode));
Node->data = data;
LinkNode *p=NULL,*q=NULL;
or(p=head;p->next&&p->next->data < data; p=p->next){
}
Node->next = p->next;
p->next = Node;

}

//对链表进行逆置

void revert_linklist(LinkNode *head)

{
LinkNode *p=NULL,*q=NULL,*t=NULL;
p = head->next;
head->next = NULL;

for(;p!=NULL;){
t = p->next;
p->next = head->next;
head->next = p;
p = t;
}

}

//链表按数据大小进行排序

void sort_linklist(LinkNode *head)

{
LinkNode *p = NULL, *q = NULL, *t = NULL;
p = head->next;
head->next = NULL;
while(p){
or(q=head;q!=NULL && q->next->data < p->data;q=q->next)
}

t = p->next;
p->next = q->next;
q->next = p;
p = t;
}

//删除链表中的某个节点

void delete_linklist(LinkNode *head, DATATYPE data)

{
LinkNode *p = head,*q = head;
for(q=head,p=head->next;p!=NULL;){
if(data == p->data){
q->next = p->next;
free(p);
p=q->next;
}
else{
p=p->next;
q=q->next;
}
}

}

//清空链表

void clean_linklist(LinkNode *head)

{
LinkNode *p = head,*currentNode = NULL;
while(p){
currentNode = p->next;
free(p);
p = currentNode;
}

}

//显示链表数据

void show_linklist(LinkNode *head)

{
while(head->next){
p
4000
rintf("list data: %d\n",head->next->data);
head = head->next;
}

}

//查找链表中的某个节点

void findMiddeleNode(LinkNode *head)

{
LinkNode *p=head,*q=head;
while(p!=NULL){
p = p->next;
q = q->next->next;
}
printf("the middle node's data: %d\n",q->data);

}

//把两个有序的链表合并成一个有序的链表

void compos_linklist(LinkNode *p1, LinkNode *p2)

{
LinkNode *t2 = p2->next;
LinkNode *t1 = p1,*ps;

while(t2 != NULL){
for(; t1 != NULL && t1->next->data < t2->data;t1=t1->next){
}
ps = t1->next;
t2->next = t1->next;
t1->next = t2;
t1 = ps;
t2 = t2->next;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: