您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】单链表学习笔记

2013-04-19 17:59 375 查看
开发环境:

操作系统:Ubuntu

编辑器:vim

编译器:gcc

调试器:gdb

代码如下:

#include<stdio.h>
#include<malloc.h>

typedef struct studentT
{
int num;
float score;
struct studentT *next;
}student;

/*函数名:create*/
/*功能:返回指向链表头节点的指针*/
/*输入:无*/
/*输出:无*/
student *create()
{
student *head;
student *p,*tail;
/* float temp;*/
head=NULL;
do
{
p=(student *)malloc(sizeof(student));
scanf("%d %f",&p->num,&p->score);
if(p->num==0)
{
free(p);
break;
}/*非法数据删除地址空间*/
/*  p->score=temp;*/
p->next=NULL;
if(head==NULL)
{head=p;tail=p;}/*第一个数据插入表头*/
else
{tail->next=p;tail=p;}/*新结点插入表尾*/
}while(p->num!=0);
return head;
}

/*函数名:display*/
/*功能:打印链表中所有的元素*/
/*输入:无*/
/*输出:链表中所有的数据*/
void display(student *head)
{
student *p;
p=head;
while(p!=NULL)
{
printf("%4d %5.1f",p->num,p->score);
p=p->next;
}/*数据链表实现遍历*/
printf("\n");
}

/*函数名:insert*/
/*功能:按学号顺序插入数据*/
/*输入:无*/
/*输出:无*/
student *insert(student *head,student *new)
{
student *p,*q;
if(head==NULL)
head=new;
else
{
if(head->num>=new->num)
{
new->next=head;
head=new;
}/*学号小的放在链首*/
else
{
p=head;
while(p->num<new->num&&p->next!=NULL)
{
q=p;
p=p->next;
}/*循环直到待插入结点的学号小于前一结点的学号*/
if(p->num>new->num)
{
q->next=new;
new->next=p;
}
else
{
p->next=new;
new->next=NULL;
}/*该结点插入到链表的尾部*/
}
}
return head;
}

/*函数名:delete*/
/*功能:删除指定学号的数据*/
/*输入:无*/
/*输出:无*/
student *delete(student *head,int num)
{
student *p1,*p2;
if(head==NULL)
printf("ERROR\n");
else
{
p1=head;
while(num!=p1->num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}/*查找学号为num的结点*/
if(num==p1->num)
{
if(p1==head)
head=p1->next;/*删除头结点*/
else
p2->next=p1->next;/*下一结点的地址赋值给前一结点的指针域*/
free(p1);/*释放内存空间*/
}
else
printf("ERROR\n");
}
return head;
}

/*函数名:main*/
/*功能:建立学生成绩单链表,实现对记录的遍历、插入、插入*/
/*输入:无*/
/*输出:打印成绩单链表*/
int main()
{
student *l,*temp;
int temp1=0;
l=create();/*建立成绩单链表*/
display(l);/*遍历单链表*/
temp=(student *)malloc(sizeof(student));
scanf("%d %f",&temp->num,&temp->score);
temp->next=NULL;
l=insert(l,temp);/*插入一个结点*/
display(l);/*打印单链表*/
scanf("%d",&temp1);/*读入要删除的学号*/
delete(l,temp1);
display(l);/*打印删除结点后的单链表*/
return 1;

}


测试:

1、建立成绩单链表(0 0结束输入),并打印:



2、插入学号4的数据,并打印:



3、删除学号4的数据,并打印:



程序基本实现功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: