链表
1.创建链表
2.链表插入数据
3.删除链表数据
4.输出链表数据
5.删除链表
下面创建五个自定义函数分别进行五个上面的操作
typedef struct Grade_Info NODE;
//1.创建链表
NODE *Create_LinkList(void)
{
NODE *head, *tail, *pnew;
int score;
head = (NODE *)malloc(sizeof(NODE));//创建头节点
if(head == NULL)//创建失败,则返回
{
printf("no enough memory!\n");
return (NULL);
}
head->next = NULL; //头节点的指针域置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 (NULL);
}
pnew->score = score;
pnew->next = NULL;
tail->next = pnew;
/*是让头结点指向后一个节点,也就是建立两个节点的关联关系
然后面的tail=pnew;后,尾结点就变成了第二个
再次调用该函数再执行这一句时第二个节点指向第三个节点,
所以不是head->next=pnew;这样的话中间的节点没有记录上*/
tail = pnew; //让tail指针表示真正意义上的尾结点
}
return (head);
}
//在指定位置插入节点
注意:head 和 tail 都不存放数据
开始是三个结构体指针指向结构体head
head tail pnew
//2.在指定位置插入节点
void Insert_LinkList(NODE *head, NODE *pnew, int i)
{
NODE *p;
int j;
p = head;
for(j = 0; j < i && p != NULL; j++)//将p指向要插入的第i个节点
p = p->next;
if(p == NULL)//表明链表中第i个节点不存在
{
printf ("the %d node not foundt!\n", i);
return;
}
pnew->next = p->next; //将插入节点的指针域指向第i个节点的后继节点
p->next = pnew; //将第i个节点的指针域指向插入节点
}
注意:i表示第几个要删除
//删除指定位置的节点
//删除指定位置的节点
void Delete_LinkList(NODE *head, int i)
{
NODE *p,*q;
int j;
if(i == 0)
return; //删除的是头指针,则返回
p = head;
//将p指向要删除的第i个节点的前驱节点
for(j=1; j<i && p->next != NULL; j++)
p = p->next;
if(p->next == NULL) //表明链表中第i个节点不存在
{
printf("the %d node not foundt!\n", i);
return;
}
q = p->next; //q指向待删除的节点i
p->next = q->next ; //删除节点i
free(q); //释放节点i的内存单元
}
无注意事项
//输出链表
void Display_LinkList(NODE *head)
{
NODE *p;
for(p = head->next; p != NULL; p = p->next)// 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);//退出循环后,意味着链表中只有头结点了,把它从内存中释放
}