链表
n个节点链接成链表,即线性表。
单链表
若链表的每个结点中只包含一个指针域,该链表称为线性链表或单链表。
节点结构体
typedef char ListData;
typedef struct node //链表结点
{
ListData data; //结点数据域
struct node * link; //结点链域
} ListNode;
typedef ListNode * LinkList;
LinkList first; //链表头指针
编程
/*****************************************************
Author:chenhaha Version:0.1 Date: 2016.11.1
Funcion List: 实现不带表头节点的单链表的头插和尾查
实现在指定的数据域后,插入节点
实现随机删除链表中一个节点
实现链表的释放
实现链表数据的显示
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void creat_link(Link * head)
{
*head = NULL;
}
void insert_node_head(Link * head,Link new_node) //头插
{
new_node -> next = *head; //新节点指针域指向头节点
*head = new_node; //头指针指向新节点
}
void insert_node_tail(Link * head,Link new_node) //尾插
{
Link tmp;
tmp = *head;
if(NULL == *head) //链表为空时
{
new_node -> next = NULL;
*head = new_node; //使头头指针指向最新的节点
}
else //链表不为空时
{
while(tmp->next != NULL) // while(tmp != NULL)
{ // {
tmp = tmp-> next; // tmp = tmp-> next; 此时已经已经指向NULL
} // }
tmp->next=new_node;
new_node->next =NULL;
}
}
void insert_node_mid(Link * head,Link new_node,int num) //在指定的数据域后,插入节点
{
Link tmp = *head;
if(NULL == *head)
{
printf("link is empty !\n");
return;
}
else
{
while(tmp -> num != num && tmp -> next != NULL) //找要插入的位置
{
tmp = tmp -> next;
}
if(tmp -> num == num) //找到这个数据所在节点
{
new_node -> next = tmp -> next;
tmp -> next = new_node;
}
else//没有这个节点
{
printf("no such node!\n");
}
}
}
void delete_node(Link * head,int num_delete) //删除指点数据域所在节点
{
Link tmp = *head;
Link p = tmp;
if(NULL == *head)
{
printf("link is empty !\n");
return;
}
else
{
while(tmp -> num != num_delete && tmp -> next != NULL)
{
p = tmp; //需要一个指针用于跟踪
tmp = tmp -> next;
}
if(tmp -> num == num_delete) //找到这个位置
{
if(tmp == *head) //是头节点时
{
* head = tmp -> next;
free(tmp);
}
else //不是头节点时
{
p -> next = tmp -> next;
free(tmp);
}
}
else
{
printf("no such node!\n");
}
}
}
void free_node(Link * head)
{
Link tmp = *head;
while(*head != NULL)
{
tmp = *head;
*head = (*head) -> next;
free(tmp);
}
if( *head == NULL)
{
printf("link is emtpy\n");
return;
}
}
void display(Link head)
{
Link tmp;
tmp = head;
while(tmp != NULL)
{
printf("num = %d\n",tmp->num);
tmp = tmp -> next;
}
}
int main()
{
Link head = NULL;
Link new_node = NULL;
int i;
int num_insert,num_delete;
creat_link(&head); //创建用于指向表头结点的Link型指针(头指针),此时指向NULL。
for(i = 0; i <10; i++)
{
new_node = (Link)malloc(sizeof(Node)) ; //创建一个新的节点,返回其地址
if(NULL == new_node)
{
printf("malloc error!\n");
exit(-1);
}
new_node -> num = i; //节点赋值
// insert_node_head(&head,new_node); //插入节点(头插)
insert_node_tail(&head,new_node); //插入节点(尾插)
}
display(head);
printf("请输入要插入的序号:");
scanf("%d",&num_insert);
new_node = (Link)malloc(sizeof(Node)) ; //创建一个新的节点,返回其地址
if(NULL == new_node)
{
printf("malloc error!\n");
exit(-1);
}
new_node -> num = 321; //节点赋值
insert_node_mid(&head,new_node,num_insert); //插入节点(中间)
display(head);
printf("请输入要删除的序号:");
scanf("%d",&num_delete);
delete_node(&head,num_delete);
display(head);
free_node(&head);
return 0;
}