#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>//建立一个结构体数据类型的结点,要求有next在链表中指向下一个结点
struct DATA
{
int data;
struct DATA *next; //指向下一个结点的指针
};//函数声明
struct DATA *insert(struct DATA *head, int val); //结点的插入操作
struct DATA *del(struct DATA *head, int val); //结点的删除操作
void print(struct DATA *head); //打印链表int main(int argc, char* argv[])
{
struct DATA *head = NULL;
int val; for (;;)
{
printf("输入数据建立链表(输入0结束):\n");
for (;;)
{
scanf("%d",&val);
if (0 == val)
{
break;
}
head = insert(head,val);
} printf("下面开始输出链表:\n");
print(head); printf("输入要删除的结点(输入0结束):\n");
for (;;)
{
scanf("%d",&val);
if (0 == val)
{
break;
}
head = del(head,val);
}
print(head);
} return 0;
}struct DATA *insert(struct DATA *head, int val)
{
struct DATA *p = NULL; //要插入的结点的指针
struct DATA *p1 = NULL; //该指针定义为比p更大的结点
struct DATA *p2 = NULL; //定义两个指针用于辅助结点插入,指针指向:p2->p1 //初始化要插入结点
p = (struct DATA *)malloc(sizeof(struct DATA));
if (NULL == p)
{
printf("分配内存失败!!");
return head;
}
p->data = val;
p->next = NULL; if (head == NULL)//如果链表为空,直接插入到链表头
{
head = p;
}
else //链表不为空
{
if (p->data < head->data) //按升序将结点插入链表,插入数据比头结点小,直接插入到表头
{
p->next = head; //p的下一个结点指针直接指向链表头结点
head = p; //头结点指向p
}
else //插入的数据比原链表中的数据更大或者相等
{
//依次从链表中找到比插入结点更大的结点p1,将p2的下一个结点的指针指向p,p的下一个结点的指针指向p1;
//即将p插入到p2和p1得中间,指针指向变为:p2->p->p1
for (p2 = head, p1 = head->next; p1 != NULL; p2 = p1, p1 = p1->next)
{
if (p->data < p1->data) //找到p1结点
{
//改变指针指向
p2->next = p;
p->next = p1;
break;
}
}
if (p1 == NULL)//不存在p1结点,说明p说链表中最大的结点,直接将表尾的结点的下一个接结点指针指向p
{
p2->next = p;
}
}
} //返回链表头指针
return head;
}struct DATA *del(struct DATA *head, int val)
{
struct DATA *p = NULL; //欲删除的结点
struct DATA *p2 = NULL; //要删除的结点的上一个结点,指针指向为:p2->p if (head->data == val) //如果要删除的是头结点
{
p = head; //p指向头结点,即记录头结点的指针
head = head->next; //将头结点指针指向它的下一个结点
free(p); //释放p所指向的内存
} p2 = head; //p2指向链表头
p = head->next; //p指向链表头的下一个结点,即:p2->p
while (p != NULL) //查找链表知道链表为空
{
if (p->data == val) //找到要删除的结点
{
p2->next = p->next; //原指针指向:p2->p, 假设p的下一个指针为X,现修改为:p2->X
free(p); //释放p结点指向的内存
//实现删除重复结点
p = p2->next; //p指向p2的下一个结点即X,即又形成:p2->p
continue; //继续查找
}
p2 = p; //p2指针指向p, p2指针移动到它的下一个结点
p = p->next; //p指针也移动到它的下一个结点
} return head; //返回表头,有可能为空
}void print(struct DATA *head)
{
struct DATA *p = NULL; //从头结点依次打印结点到链表为空
for (p = head;p != NULL; p = p->next)
{
printf("%d -> ",p->data);
} printf("NULL \n"); return;
}
温馨提示:答案为网友推荐,仅供参考