您的位置:首页 > 编程语言 > C语言/C++

结构体与共用体05 - 零基础入门学习C语言57

2011-03-28 02:55 656 查看

第十章:结构体与共用体05

让编程改变世界

Change the world by program

对链表结点的删除操作实现

实现源代码:

[codesyntax lang="c"]
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define LEN sizeof(struct student)  // student结构的大小

struct student *creat();   // 创建链表
struct student *del( struct student *head, int num);  // del函数用于删除结点, *head即链表
// 的头指针, num是要删除的结点num。
void print(struct student *head);   // 打印链表

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

int n;    // 全局变量,用来记录存放了多少数据。

void main()
{
struct student *stu, *p;
int n;

stu = creat();
p = stu;
print( p );

printf("Please enter the num to delete: ");
scanf("%d", &n);
print( del(p, n) );

printf("nn");
system("pause");
}

struct student *creat()
{
struct student *head;
struct student *p1, *p2;

p1 = p2 = (struct student *)malloc(LEN);  // LEN是student结构的大小

printf("Please enter the num :");
scanf("%d", &p1->num);
printf("Please enter the score :");
scanf("%f", &p1->score);

head = NULL;
n = 0;

while( p1->num )
{
n++;
if( 1 == n )
{
head = p1;
}
else
{
p2->next = p1;
}

p2 = p1;
p1 = (struct student *)malloc(LEN);

printf("nPlease enter the num :");
scanf("%d", &p1->num);
printf("Please enter the score :");
scanf("%f", &p1->score);
}

p2->next = NULL;

return head;
}

void print(struct student *head)
{
struct student *p;
printf("nThere are %d records!nn", n);

p = head;
if( head )
{
do
{
printf("学号为 %d 的成绩是: %fn", p->num, p->score);
p = p->next;
}while( p );
}
}

struct student *del( struct student *head, int num)
{
struct student *p1, *p2;

if( NULL == head ) // 如果头结点指向NULL,这是一个空链表。纯属忽悠T_T
{
printf("nThis list is null!n");
goto END;
}

p1 = head;
while( p1->num != num && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if( num == p1->num )
{
if( p1 == head )      // 当将要删除的结点位于头结点的时候
{
head = p1->next;
}
else                  // 一般情况
{
p2->next = p1->next;
}

printf("nDelete No: %d succeed!n", num);
n = n-1; // n是作为一个全局变量,用来记录链表的数据数。
}
else
{
printf("%d not been found!n", num);
}

END:
return head;
}

[/codesyntax]

对链表的插入操作

对链表的插入是指将一个结点插入到一个已有的链表中。

为了能做到正确插入,必须解决两个问题:

① 怎样找到插入的位置;

② 怎样实现插入。

我们可以先用指针变量p0指向待插入的结点,p1指向第一个结点。将p0->num与p1->num相比较,如果p0->num>p1-> num ,此时将p1后移,并使p2指向刚才p1所指的结点。

[caption id="attachment_195" align="aligncenter" width="300"]

对链表的插入操作[/caption]

[caption id="attachment_196" align="aligncenter" width="300"]

对链表的插入操作[/caption]

我们设计出程序: homework_3.c下载源代码

但是这个程序有些问题需要大家齐心协力来发掘并研究方法解决!

例如我们要实现多次插入,问题就来了!

课后练习

尝试实现插入程序并尝试制作一个学生成绩管理系统。

[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/LITOIYLWFRXQ']视频下载[/Downlink]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: