目录
1 基本原理
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
节点的构造:
链表的构造:
2 链表的基本操作
2.1节点构造
typedef struct Ifodat //数据节点
{
int data;
char status;
}Ifodat;
typedef struct Info_Node
{
Ifodat DAT;
struct Info_Node *Next;
}Info_NODE;
2.2 建立链表头
Info_NODE *Create_Head()
{
Info_NODE *Phead= (Info_NODE*)malloc(sizeof(Info_NODE));
if(Phead == NULL)
printf("Creat Phead fail\r\n");
return Phead;
}
2.3 建立链表并输入数据
/**创建链表
*
*/
Info_NODE *Create_List(Info_NODE *phead)
{
int len;
int i;
Info_NODE *P1 = (Info_NODE*)malloc(sizeof(Info_NODE));
Info_NODE *P2;
P1 = phead;
printf("Input lenght number:");
scanf("%d",&len);
for(i=0;i<len;i++)
{
P2 = (Info_NODE*)malloc(sizeof(Info_NODE));
printf("Input %d number:",i+1);
scanf("%d",&P2->DAT.data);
P2->Next = NULL;
P1->Next =P2 ;
P1 = P1->Next;
}
}
2.4 在链表头插入节点
/**插入节点到链表头部
*
*/
List_insert_head(Info_NODE *head,Info_NODE *date_node)
{
Info_NODE *P1;
P1 = head->Next;
head->Next = date_node;
date_node->Next = P1;
}
2.5 在链表尾插入节点
/**插入节点到链表尾部
*
*/
void List_insert_end(Info_NODE *head,Info_NODE *date_node)
{
Info_NODE *P = head;
while(P->Next!=NULL)
{
P = P->Next;
}
P->Next =date_node;
date_node->Next = NULL;
}
2.6 链表排序-值交换
/**链表排序
* 值交换 选择排序
*/
void Sort_List(Info_NODE *head)
{
Info_NODE *p, *q;
for (p = head->Next; p != NULL; p = p->Next)
for (q = p->Next; q != NULL; q = q->Next)
if (p->DAT.data > q->DAT.data)
{
int t1 = p->DAT.data; p->DAT.data = q->DAT.data; q->DAT.data = t1;
}
}
2.7 删除节点
/**删除某个节点
*
*/
void delete_List(Info_NODE *head,Ifodat ifo)
{
Info_NODE *p,*last;
p = head->Next;
last = head;
while(p->DAT.data!=ifo.data)
{
last = p;
p = p->Next;
}
last->Next = p->Next;
free(p);
}
2.8 释放链表
void Free_List(Info_NODE *Head)
{
Info_NODE *Pointer=NULL;
while (NULL != Head)
{
Pointer = Head;
Head = Head->Next; // 下一个节点
free(Pointer);
}
}
2.9 输出链表
/**顺序输出链表
*
*/
void Print_List(Info_NODE *head)
{
Info_NODE *P1 = head;
int i=1;
while(P1->Next!= NULL)
{
P1 = P1->Next;
printf("The %d number:%d\r\n",i,P1->DAT.data);
i++;
//P1 = P1->Next;
}
}