单向链表:链表头不包含有效数据,每个节点的next指向下一个节点,最后一个节点的next指向NULL,单向链表的操作只允许一个方向。
节点数据结构:
typedef int datatype;
typedef struct linklist{
datatype data;
struct linklist *next;
}singlelist,*psinglelist;
初始化单链表头结点:
void SingleList_Init(psinglelist *Head)
{
*Head = (psinglelist)malloc(sizeof(singlelist));
if(*Head == NULL)
{
perror("malloc");
exit(1);
}
(*Head)->next = NULL;
}
int SingleList_InsertTail(psinglelist Head,psinglelist New)
{
psinglelist node;
if(Head==NULL)
{
perror("psinglelist Head error");
return -1;
}
if(Head->next==NULL)
{
Head->next = New;
New->next = NULL;
}
else
{
/* 使node走到尾节点 */
for( node = Head->next; node->next != NULL; node = node->next);
node->next = New;
New->next = NULL;
}
return 0;
}
从头部插入节点:
int SingleList_InsertHead(psinglelist Head,psinglelist New)
{
psinglelist node;
if(Head==NULL)
{
perror("psinglelist Head error");
return -1;
}
New->next = Head->next;
Head->next = New;
return 0;
}
创建n个节点:
int SingleList_Create(psinglelist Head,int n)
{
int i;
psinglelist node;
if(Head==NULL)
{
perror("psinglelist Head error");
return -1;
}
for(i = 0; i < n; i++)
{
node = (psinglelist)malloc(sizeof(singlelist));
if(node == NULL)
{
perror("malloc");
exit(1);
}
printf("请输入第%d个节点的数据:",i+1);
scanf("%d",&node->data);
SingleList_InsertTail(Head,node);
}
}
删除指定数据的节点:
void SingleList_Delete(psinglelist Head,datatype data)
{
psinglelist pPre; /* 用于保存待删除节点的上一个节点 */
psinglelist H = Head;
while(NULL!=Head->next)
{
pPre = H; /* 先保存当前节点 */
H = H->next; /* 指向下一个节点 */
/* 找到要删除的节点 */
if(H->data == data)
{
/* 如果这个是链表的尾节点 */
if(H->next==NULL)
{
pPre->next = NULL;
free(H);
}
else
{
pPre->next = H->next;
free(H);
}
printf("删除节点成功\n");
return;
}
}
printf("没有找到该节点!\n");
}
遍历单向链表:
int SingleList_each(psinglelist Head)
{
psinglelist H;
if(Head==NULL)
{
perror("psinglelist Head error");
return -1;
}
printf("链表数据:");
for(H = Head->next; H != NULL; H = H->next)
{
printf(" %d",H->data);
}
printf("\n");
}
int main(void)
{
psinglelist list;
datatype data;
SingleList_Init(&list);
SingleList_Create(list, 5);
SingleList_each(list);
printf("请输入删除的数据:");
scanf("%d",&data);
SingleList_Delete(list,data);
SingleList_each(list);
}
实例效果: