创建一个链表,完成链表的遍历、删除、插入。
struct Stu //链表节点结构体类型
{
int data; //数据域
struct Stu* next; //指针域
};
typedef struct Stu NODE; //定义类型别名
//******************创建链表***************
NODE* create()
{
NODE* p, * head, * q;
head = malloc(sizeof(NODE)); //申请分配(sizeof(NODE))内存长度的内存单元,存储头节点
p = head; //p为末节点,开始时指向头节点head
int t = 0; //向链表内键入数据
while (1)
{
printf("输入一个整数,以负数结尾:");
scanf("%d", &t);
if (t < 0) break;
q = malloc(sizeof(NODE)); //创建新节点储存输入的数据t
q->data = t;
p->next = q;
p = q; //此时q成为末节点,将p移动到q,p依然是末节点
}
p->next = NULL;
return head;
}
//******************遍历链表***************
void Traversal(NODE* head)
{
NODE* p;
p = head->next;
if (p == NULL)
{
printf("此链表为空链表!\n");
}
else
{
printf("链表数据为:\n");
while (p != NULL)
{
printf("->%d", p->data);
p = p->next;
}
}
return head;
}
//***************删除链表数据************************
void Delete(NODE* head, int d)
{
NODE* q, * p;
q = head;
p = head->next;
while (p != NULL)
{
if (p->data == d)
{
q->next = p->next;
free(p);
break;
}
else
{
q = p;
p = p->next;
}
}
if (p == NULL)
{
printf("无符合条件的节点!\n");
}
}
//***************插入链表数据************************
void Insert(NODE* head, int t)
{
NODE* r, * p, * q;
r = malloc(sizeof(NODE));
r->data = t;
q = head;
p = head->next;
while (p != NULL)
{
if (p->data < t) //假设链表升序排列
{
q = p;
p = p->next;
}
else break;
}
q->next = r;
r->next = p;
}
//****************主函数*********************
int main()
{
NODE* h; //头节点,知道了头节点,就知道了整个链表
h = create();
Traversal(h);
int d = 0; //要删除的数据
int t = 0; //要插入的数据
//删除节点
while (1)
{
printf("\n请输入要删除的数据:\n");
scanf("%d", &d);
if (d < 0) break;
Delete(h, d);
Traversal(h);
}
//插入节点
while (1)
{
printf("\n请输入要插入的数据:\n");
scanf("%d", &t);
if (t < 0) break;
Insert(h, t);
Traversal(h);
}
// printf("\n头指针=%p\n", h);
return 0;
}