链表操作--创建--删除--插入--打印
2010-10-18 10:15
357 查看
//链表的综合操作!!!
#include
#include
struct student * creat(void);
void print(struct student *head);
struct student * del(struct student * head ,long num);
struct student * insert(struct student *head,struct student *stud);
int n;
struct student
{
long num;
float score;
struct student * next;
};
int main()
{
struct student * head,stu;
long del_num;
printf("input records:/n");
head = creat(); //建立链表,返回指针
print(head); //输出全部结点
printf("/ninput the deleted number:");
scanf("%ld",&del_num); //输入要删除的结点的学号
head=del(head,del_num); //删除后链表的头地址
print(head);
printf("/ninput the inserted record:"); //输入要插入的结点
scanf("%ld %f",&stu.num,&stu.score);
head = insert(head,&stu); //插入一个结点,返回头结点地址
print(head); //输出全部结点
}
struct student * creat(void)
{
struct student *head;
struct student *p1,*p2;
n=0;
printf("输入格式为/"学号/"+空格+/"成绩/"/n");
p1=p2=(struct student *) malloc(sizeof(struct student));//开辟一个新单元
scanf("%ld %f",&p1->num,&p1->score);
head = NULL;
while(p1->num != 0)
{
n = n+1;
if( n == 1) head = p1;
else p2->next=p1;
p2 = p1;
p1=(struct student *)malloc(sizeof(struct student));
scanf("%ld %f",&p1->num,&p1->score);
}
p2->next = NULL;
return(head);
}
struct student * del(struct student * head ,long num)
{
struct student *p1,*p2;
if(head == NULL) {printf("/nlist null!/n"); return head;}
else
{ p1=head;
while(num != p1->num && p1->next != NULL) //p1指向的不是要找的结点,并且后面还有结点
{p2=p1;p1=p1->next;} //p1后移一个结点
if(num == p1->num) //找到了
{
if(p1 == head) head =p1->next; //若p1指向的是首结点,把第二个结点地址赋予head
else p2->next = p1->next; //否则将下一结点地址赋给前一结点地址
printf("delete :%ld/n",num);
n=n-1;
}
else printf("%ld not been found !/n",num); //找不到该结点
return(head);
}
}
struct student * insert(struct student *head,struct student *stud)
{
struct student *p0,*p1,*p2;
p1 = head;
p0 = stud;
if(head == NULL)
{head = p0; p0->next = NULL;}
else
{
while((p0->num > p1->num)&&(p1->next != NULL))//如果比这个大,那就继续向下寻找。。。
{
p2 = p1;
p1 = p1->next;
}
if(p0->num <= p1->num)
{
if(head == p1) head = p0; //插入到原来的第一个结点之前
else p2->next = p0; //插入到p2指向的结点之后
p0->next = p1;
}
else{p1->next = p0;p0->next=NULL;}
}
n=n+1;
return(head);
}
void print(struct student *head)
{
struct student * p;
printf("/nNow,These %d records are:/n",n);
p=head;
if(head != NULL)
do
{printf("%ld %5.1f/n",p->num,p->score);
p=p->next;
}while(p != NULL);
}
#include
#include
struct student * creat(void);
void print(struct student *head);
struct student * del(struct student * head ,long num);
struct student * insert(struct student *head,struct student *stud);
int n;
struct student
{
long num;
float score;
struct student * next;
};
int main()
{
struct student * head,stu;
long del_num;
printf("input records:/n");
head = creat(); //建立链表,返回指针
print(head); //输出全部结点
printf("/ninput the deleted number:");
scanf("%ld",&del_num); //输入要删除的结点的学号
head=del(head,del_num); //删除后链表的头地址
print(head);
printf("/ninput the inserted record:"); //输入要插入的结点
scanf("%ld %f",&stu.num,&stu.score);
head = insert(head,&stu); //插入一个结点,返回头结点地址
print(head); //输出全部结点
}
struct student * creat(void)
{
struct student *head;
struct student *p1,*p2;
n=0;
printf("输入格式为/"学号/"+空格+/"成绩/"/n");
p1=p2=(struct student *) malloc(sizeof(struct student));//开辟一个新单元
scanf("%ld %f",&p1->num,&p1->score);
head = NULL;
while(p1->num != 0)
{
n = n+1;
if( n == 1) head = p1;
else p2->next=p1;
p2 = p1;
p1=(struct student *)malloc(sizeof(struct student));
scanf("%ld %f",&p1->num,&p1->score);
}
p2->next = NULL;
return(head);
}
struct student * del(struct student * head ,long num)
{
struct student *p1,*p2;
if(head == NULL) {printf("/nlist null!/n"); return head;}
else
{ p1=head;
while(num != p1->num && p1->next != NULL) //p1指向的不是要找的结点,并且后面还有结点
{p2=p1;p1=p1->next;} //p1后移一个结点
if(num == p1->num) //找到了
{
if(p1 == head) head =p1->next; //若p1指向的是首结点,把第二个结点地址赋予head
else p2->next = p1->next; //否则将下一结点地址赋给前一结点地址
printf("delete :%ld/n",num);
n=n-1;
}
else printf("%ld not been found !/n",num); //找不到该结点
return(head);
}
}
struct student * insert(struct student *head,struct student *stud)
{
struct student *p0,*p1,*p2;
p1 = head;
p0 = stud;
if(head == NULL)
{head = p0; p0->next = NULL;}
else
{
while((p0->num > p1->num)&&(p1->next != NULL))//如果比这个大,那就继续向下寻找。。。
{
p2 = p1;
p1 = p1->next;
}
if(p0->num <= p1->num)
{
if(head == p1) head = p0; //插入到原来的第一个结点之前
else p2->next = p0; //插入到p2指向的结点之后
p0->next = p1;
}
else{p1->next = p0;p0->next=NULL;}
}
n=n+1;
return(head);
}
void print(struct student *head)
{
struct student * p;
printf("/nNow,These %d records are:/n",n);
p=head;
if(head != NULL)
do
{printf("%ld %5.1f/n",p->num,p->score);
p=p->next;
}while(p != NULL);
}
相关文章推荐
- C语言各种链表操作(创建、打印、删除、插入、反转)
- c++之链表篇1:单向链表的创建,打印,删除,插入,销毁等基本操作
- C-链表的一些基本操作【创建-删除-打印-插入】
- 线性表的链式存储格式基本操作:创建链表、插入、删除、查找、求表长、打印链表
- 链表操作综合练习(创建、拆分、插入、删除、合并、打印、逆置)
- java语言编写链表的基本操作(链表的创建,插入,删除,打印,排序)
- c语言链表基本操作(带有创建链表 删除 打印 插入)
- 链表的全部操作——创建、插入、查找、删除、计算长度
- 算法研究之——链表的一些操作(创建、打印,在头部、中间、尾部插入节点)
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- 链表的基础操作总结(链表创建,插入,删除,遍历等等)
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- 单链表创建插入删除打印反转
- 单链表的建立,查找,插入,删除,测长,打印,逆置操作实现
- 链表的创建、插入、删除等操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- (C++版)链表(一)——实现单向链表创建、插入、删除等相关操作
- 单链表的创建,删除,插入,翻转,打印--数组存入单链表,单链表翻转