转自:http://blog.163.com/xujian900308@126/blog/static/1269076152011917101420316/
#include <stdio.h>
#include <stdlib.h>
struct grade {
int score;
struct grade *next;
} *head, *pnew;
typedef struct grade NODE;
//创建链表
struct grade *create();
//插入链表
void insert(NODE *head,NODE *pnew,int i);
//删除列表
void pdelete(NODE *head, int i);
//输出链表
void display(NODE *head);
//销毁链表
void Pfree(NODE *head);
int main(int argc, const char * argv[])
{
head = create();
if (head==NULL)
{
return 0;
}
puts("输出创建的链表");
display(head);
pnew = (NODE*)malloc(sizeof(NODE));
if (pnew==NULL)
{
puts("创建失败");
return 0;
}
display(pnew);
//将新节点插入节点3的后面
pnew->score = 33;
insert(head, pnew, 3);
puts("插入后的链表");
display(head);
//删除节点3
pdelete(head, 3);
puts("删除后的链表: ");
display(head);
/*
输出:
输入学生成绩
100
90
80
70
30
-10
输出创建的链表
100 90 80 70 30
插入后的链表
100 90 80 33 70 30
删除后的链表:
100 90 33 70 30
*/
return 0;
}
struct grade *create()
{
NODE *head, *tail, *pnew;
int score;
//创建头节点
head = (NODE*)malloc(sizeof(NODE));
if (head==NULL)
{
puts("创建失败");
return NULL;
}
//头节点指针域置NULL
head->next = NULL;
//开始时尾指针指向头节点
tail = head;
puts("输入学生成绩");
//创建链表
while (1)
{
scanf("%d",&score);
//成绩为负退出循环
if (score<0)
{
break;
}
//创建新节点
pnew = (NODE*)malloc(sizeof(NODE));
if (pnew==NULL)
{
return NULL;
}
pnew->score = score;
//新节点指针域置空
pnew->next = NULL;
//新节点插入到表尾
tail->next = pnew;
//为指针指向当前的尾节点
tail = pnew;
}
return head;
}
//插入链表
void insert(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("与插入的节点不存在!");
return;
}
pnew->next=p->next; //插入节点的指针域指向第i个节点的后继节点
p->next=pnew; //犟第i个节点的指针域指向插入的新节点
}
//删除列表
void pdelete(NODE *head, int i)
{
NODE *p,*q;
int j;
if(i==0) //删除的是头指针,返回
return;
p=head;
for(j=1;j<i&&p->next!=NULL;j++)
p=p->next; //将p指向要删除的第i个节点的前驱节点
if(p->next==NULL) //表明链表中的节点不存在
{
printf("不存在!");
return;
}
q=p->next; //q指向待删除的节点
p->next=q->next; //删除节点i,也可写成p->next=p->next->next
free(q); //释放节点i的内存单元
}
//输出链表
void display(NODE *head)
{
NODE *p;
for(p=head->next;p!=NULL;p=p->next)
{
printf("%d ",p->score);
}
printf("\n");
}
//销毁链表
void Pfree(NODE *head)
{
NODE *p,*q;
p=head;
while(p->next!=NULL) //每次删除头节点的后继节点
{
q=p->next;
p->next=q->next;
free(q);
}
free (head); //最后删除头节点
}