#include<stdio.h>
#include<stdlib.h>
struct Grade_Info
{
int score;
struct Grade_Info *next;
};
typedef struct Grade_Info NODE;
NODE *Create_LinkList();
void Insert_LinkList(NODE *head,NODE *pnew,
int i);
void Delete_LinkList(NODE *head,
int i);
void Display_LinkList(NODE *head);
void Free_LinkList(NODE *head);
void main()
{
NODE *head, *pnew;
head = Create_LinkList();
if(head==NULL)
{
printf(
"no enough memory!\n");
return;
}
printf(
"after create:");
Display_LinkList(head);
pnew = (NODE *)
malloc(
sizeof(NODE));
if(pnew==NULL)
{
printf(
"no enough memory!\n");
return;
}
pnew->score =
88;
Insert_LinkList(head,pnew,
3);
printf(
"after insert:\n");
Display_LinkList(head);
Delete_LinkList(head,
3);
printf(
"after delete:\n");
Display_LinkList(head);
Free_LinkList(head);
}
NODE *Create_LinkList()
{
NODE *head,*tail, *pnew;
int score;
head = (NODE *)
malloc(
sizeof(NODE));
if(head==NULL)
{
printf(
"no enough memory!\n");
return 0;
}
head->next = NULL;
tail = head;
printf(
"input the score of students:\n");
while(
1)
{
scanf(
"%d",&score);
if(score <
0)
break;
pnew = (NODE *)
malloc(
sizeof(NODE));
if(pnew==NULL)
{
printf(
"no enough memory!\n");
return 0;
}
pnew->score = score;
pnew->next = NULL;
tail->next = pnew;
tail = pnew;
}
return(head);}
//增加节点: 在第 I 个节点后 插入一个新节点 (头结点算第
0个节点)
void Insert_LinkList(NODE
*head, NODE
*pnew,
int i)
{
NODE
*p;
int j;
p = head;
//为什么要写这一步,不能用head直接操作吗,直接操作会改变head的指向吗?
for(j =
0;p != NULL&&j<i; j++) //将P指向要插入的 第 i 个节点
p = p->
next;
if(p == NULL) //表明第i个节点不存在
{
printf(
"the %d node not found !\n", i);
return;
}
pnew->
next = p->
next;
p->
next = pnew;
}
//删除节点的值
void Delete_LinkList(NODE
*head,
int i)
{
NODE
*p,
*q;
int j;
if(i==
0) //删除的是头指针,则返回a
return;
p = head;
for(j=
1;j<i&&p->
next!=NULL;j++) //找出第i个节点的 前驱节点,并且要保证后第i个节点存在
p=p->
next;
if(p->
next==NULL) //表明第i个节点不存在
{
printf(
"the %d node not foundt!\n",i);
return;
}
q = p->
next;
p->
next =
q->
next;
free(
q);
//释放节点 i 的内存单元
}
//链表的输出操作
void Display_LinkList(NODE
*head)
{
NODE
*p;
int j;
//方法一:
p = head;
for(j=
1;p->
next!=NULL;j++)
{
p=p->
next;
printf(
"NODE[j]=%d\t",p->score);
if(j
%3==
0)
printf(
"\n");
}
//方法二:
/*
for(p=head->
next; p!= NULL; p=p->
next)
printf(
"%d ",p->score);
printf(
"\n");
*/
/*
}
//销毁链表
void Free_LinkList(NODE
*head)
{
NODE
*p,
*q;
p=head;
while (p->
next !=NULL)
{
q = p->
next;
p->
next =
q->
next;
free(
q);
}
free(head);
}
转载请注明原文地址: https://ju.6miu.com/read-26554.html