线性链表
#include<stdio.h>
//C语言P345 线性链表
struct Grade
//可以理解为score是存储数据,next是指针,一个链表是由 数据+指针 组成
{
int score;
struct Grade *next;//指向自身的指针
};
typedef struct Grade NODE;//记住typedef的用法
//线性表的创建
NODE *Create_LinkList() {
NODE *head;//头结点
NODE *tail;//尾结点
NODE *pnew;//指向实际数据的节点
int score;//数据
head = (NODE *)malloc(sizeof(NODE));//创建头结点
if (head==NULL)
{
printf("头结点创建失败!");
return NULL;
}
head->next = NULL;//头结点的指针域设置为NULL
tail = head;//开始时尾结点指向头结点0
printf("输入学生的成绩:");
while (1)
{
scanf("%d", &score);
if(score<0) //当输入成绩为负,跳出循环,停止输入
break;
pnew = (NODE *)malloc(sizeof(NODE));//创建新的节点
if (pnew==NULL)
{
printf("没有足够的空间!\n");
return NULL;
}
pnew->score = score;//新节点数据域存放数据
pnew->next = NULL;//新节点的指针域设置为NULL
tail->next = pnew;//新节点插入到链尾
tail = pnew;//指向当前的尾结点
}
return head;//返回创建的链表的头结点
}
//插入操作
void Insert_LinkList(NODE *head, NODE *pnew, int i) {
NODE *p;
int j;
p = head;
for (j = 0;j < i&&p != NULL;j++)
p = p->next;
if (p==NULL)
{
printf("第%d个节点不存在!\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)
return;
p = head;
for (j = 1;j < i&&p->next != NULL;j++)
p = p->next;
if (p->next==NULL)
{
printf("第%d个和节点不存在!\n", i);
return;
}
q = p->next;//q指向待删除的节点i
p->next = q->next;//其实上面两句相当于p->next = p->next->next
free(q);//释放第i个节点的数据
}
//链表的输出操作
void Display_LinkList(NODE *head) {
NODE *p;
for (p = head->next;p!=NULL;p = p->next)
printf("%d\t", 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);
}
void main() {
NODE *head, *pnew;
head = Create_LinkList();//创建链表,输入数据
if (head == NULL)//创建失败
return;
printf("输出创建节点:");
Display_LinkList(head);//链表的输出操作
pnew = (NODE *)malloc(sizeof(NODE));//新建一个节点
if (pnew==NULL)
{
printf("节点创建失败!");
return;
}
pnew->score = 88;
Insert_LinkList(head, pnew, 3);//将新节点插入节点3后面
printf("插入新的节点:");
Display_LinkList(head);//输出操作
Delete_LinkList(head, 3);//删除节点3
printf("删除节点后:");
Display_LinkList(head);//输出操作
Free_LinkList(head);//销毁链表
}
输出数据可以为非零正数,在最后输入-1表示结束
例如120 130 140 150 160 -1