C语言基础入门:链表详解篇
链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:
一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
链表的各类操作包括:学习单向链表的创建、删除、 插入(无序、有序)、输出、 排序(选择、插入、冒泡)、反序等等。
基本操作
1. 节点的构造
#include
#include
#include
#defineLEN sizeof(struct stu)structstu{
//数据char num[10];char name[20];float score;
//指针structstu*next;};
2. 建立链表
struct stu *create(){
/structstu*head;structstu*p1, *p2;
head = (struct stu *)malloc(LEN); head->next =NULL;
p1 = head;
p2 = (struct stu *)malloc(LEN);
printf("输入个人信息:学籍号、姓名和总成绩\n");
scanf("%s%s%f",p2->num, p2->name, &p2->score); getchar();
while(strcmp(p2->num,"0") !=0){/*
执行结束后
1。p2的next域为NULL.
2。第一个节点的next域指向第二个节点的数据域
3。p1指针指向第二个节点的数据域
p2->next = p1->next; p1->next = p2; p1 = p2;
p2 = (struct stu *)malloc(LEN);printf("输入个人信息:学籍号、姓名和总成绩\n");
scanf("%s%s%f",p2->num, p2->name, &p2->score); getchar(); }
free(p2);returnhead;};
3. 输出链表
void print(struct stu * head){structstu*p;
printf("num name score\n"); p = head->next;
while(p!=NULL){
printf("%-10s %-20s %-4.1f\n",p->num, p->name, p->score);
p=p->next; }}
4. 插入节点
void insert(struct stu * head, struct stu * p0)
{ struct stu *p1, *p2; p1 = head->next;p2 = head;
while((p1!=NULL) && (strcmp(p0->num, p1->num)==1))
{p2=p1; p1=p1->next; } p0->next = p2->next; p2->next = p0;}
5. 删除节点
int delete(struct stu *head,charnum[]){ structstu*p1, *p2;p1 = head->next; p2 = head;
while(p1!=NULL&&strcmp(num, p1->num)!=0)
{ p2=p1; p1=p1->next; }
if(!p1){return0; }
p2->next = p1->next;free(p1);return1;}
6. 主函数
//主函数int main()
{structstu*h, *p0;charnum[10];printf("建立链表\n");
h = create(); p0 = (struct stu *)malloc(LEN);
printf("输入待插入的个人信息:学籍号、姓名和总成绩\n");
scanf("%s%s%f",p0->num, p0->name, &p0->score);
getchar();if(strcmp(p0->num,"0") !=0){ insert(h, p0); }
printf("输入待删除个人信息的学号\n");
scanf("%s",num);if(strcmp(num,"0") !=0){delete(h, num);
}printf("输出链表\n"); print(h);return0;}郑州不孕不育医院http://jbk.39.net/yiyuanzaixian/zztjyy/