#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);
}