双向链表实验报告

13软工转本1 钱剑滨 实验报告

双向链表实验报告

信息工程 系 13软工转本1 日期 2016年03月12日 姓名 钱剑滨 学号 13131116 电话

一、 实验内容

编写关于双向链表操作的C语言程序,要求包含双向链表的创建(生成)、输出(遍历)、查找、任意位置插入、有顺序插入、删除、等。

二、 实验步骤

1.

2.

3.

4. 分析操作所需思路,熟练运用单链表的各种特点。 编写程序,利用函数特性进行操作。 运行程序,纠正错误,对预测结果进行验证。 分析总结单链表的优缺点,并可以做到熟练掌握双向链表的各种操作。

三、 设计概要

1. 本实验包含了7个函数:

a) 主函数main()

b) 创建链表函数Listcreate()

c) 数据输出函数Listprint()

d) 查找数据函数Listlocate()

e) 无序插入函数Listinsert_discretion ()

f) 有序插入函数Listinsert_order

g) 删除数据函数Listdelete()

2. 明确函数的功能;

a) Listcreate() 创建一个可控长度的斐波那契数列的双向链表。 b) Listprint() 将此链表中的数据全部输出。

c) Listlocate() 查找此链表中任意位置元素的值。

d) Listinsert_discretion ()向此链表的某个位置插入一组数据。

e) Listinsert_order() 向数列中插入一个数,使插入后的数列任然有序

f) Listdelete() 将此链表的某个位置的一组数据删除。

四、 程序设计

1. 函数前包含的头文件名、结点类型定义、全局变量和函数声明 #include

#include

typedef struct number //定义结构体

{

struct number *prior;

int num;

struct number *next;

}number;

number *head; //定义全局变量头节点 int k = 0; //k记录元素个数,防止溢出

/*函数声明*/

void Listcreate(); //建立链表

void Listprint(); //全体输出

void Listlocate(); //查找

void Listinsert_discretion(); //任意位置插入

void Listinsert_order(); //有顺序插入

void Listdelete(); //删除

2. 主函数main()

void main()

{

int select;

printf("1、输入斐波那契数列的个数\n");

printf("2、全部输出数列\n");

printf("3、查找定位数列的元素\n");

printf("4、添加数列元素\n");

printf("5、插入顺序数列元素\n");

printf("6、删除数列元素\n");

printf("-------------------------------------\n");

while (1)

{

printf("请选择序号\n");

scanf("%d", &select);

switch (select)

{

case 1: Listcreate(); break; //链表创建 case 2: Listprint(); break; //全链表输出 case 3: Listlocate(); break; //元素查找 case 4: Listinsert_discretion(); break; //任意位置插入

case 5: Listinsert_order(); break; //有顺序插入

case 6: Listdelete(); break; //删除

default: break;

}

}

}

3. 创建链表函数Listcreate()

void Listcreate() //建立链表

{

head = (number *)malloc(sizeof (number)); //开辟一个大小为number的内存空间给头节点

head->next = NULL;

head->prior = NULL;

int a = 1,b = 1; //a、b为斐波那契数列的前两个元素 int i;

number *q;

number *p = head; //p始终指向最后一个节点

printf("输入元素的长度\n");

scanf("%d",&i);

/*给第一个元素赋值*/

q = (number *)malloc(sizeof (number)); //开辟一个大小为number的内存空间给后面节点

q->num = a;

q->next = NULL; //新开辟的节点指向NULL

p->next = q; //前一节点指向新开辟的节点

q->prior = p; //开辟的节点前驱指向p

p = p->next; //p指向新节点

i = i - 1;

k = k + 1;

/*给第二个元素赋值*/

q = (number *)malloc(sizeof (number));

q->num = b;

q->next = NULL;

p->next = q;

q->prior = p;

p = p->next;

i = i - 1;

k = k + 1;

/*给后续元素赋值*/

while (i--)

q = (number *)malloc(sizeof (number));

q->num = (a+b);

q->next = NULL;

p->next = q;

q->prior = p;

p = p->next;

a = a + b + b; //

b = a - b; //将a+b的值付给b;b的值付给a

a = a - b; //

k = k + 1;

}

printf("链表建立成功\n");

}

4. 数据输出函数Listprint()

void Listprint() //全体输出

{

number *p = head->next;

while (p != NULL)

{

printf("%d ", p->num);

p = p->next;

}

printf("\n");

}

5. 查找数据函数Listlocate()

void Listlocate() //查找

{

int i;

number *p = head;

printf("输入您要查询的元素位置\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("查询的位置不存在\n");

}

else

{

while (i--)

{

p = p->next;

}

printf("所查找数为%d\n", p->num);

}

}

6. 无序插入函数Listinsert_discretion()

void Listinsert_discretion() //任意位置插入

{

int i;

number *q;

number *p = head;

printf("输入您要插入哪个元素的后面\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("插入的位置不存在\n");

}

else

{

while (i--)

{

p = p->next; //p最后指向要插入位置的前一个节点 }

q = (number *)malloc(sizeof (number));

if (p->next == NULL) //插到末尾

{

q->next = NULL; //B的下一个元素指向空 p->next = q; //p的下一个元素指向B q->prior = p; //B的前驱指向p

}

else

{

q->next = p->next; //B的下一个元素指向p的下一个(两个不能反)

p->next->prior = q; //p的下一个元素的前驱指向B p->next = q; //p的下一个元素指向B

q->prior = p; //B的前驱指向p

}

printf("输入您要插入的数\n");

scanf("%d", &(q->num));

k = k + 1;

}

printf("插入成功\n");

}

7. 有序插入函数Listinsert_order ()

void Listinsert_order() //有顺序插入

{

number *q;

number *p = head;

q = (number *)malloc(sizeof (number));

printf("输入您要插入哪个数\n");

scanf("%d", &q->num);

while (p->next)

{

if (p->next->num >= q->num) //插在第一个比数大或等于的的数前

{

q->next = p->next;

p->next->prior = q;

p->next = q;

q->prior = p;

k = k + 1;

break;

}

else

{

p = p->next;

}

}

if (p->next == NULL)

{

q->next = NULL;

p->next = q;

q->prior = p;

k = k + 1;

}

printf("插入成功\n");

}

8. 删除数据函数Listdelete ()

void Listdelete() //删除

{

int i;

number *q;

number *p=head;

printf("输入您要删除哪个元素\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("删除的位置不存在\n");

}

else

//插到末尾

{

while (--i) //这里是先减再判断

{

p = p->next; //p指向被删除的元素的前一个元素

}

q = p->next; //q指向被删除的元素

if (q->next == NULL) //删除最后一个元素

{

p->next = NULL;

}

else

{

p->next = q->next;

一个,即跳过被删除元素

q->next->prior = p;

p,也跳过被删除的元素

}

free(q);

k = k - 1;

}

printf("删除成功\n");

}

//p的下一个元素指向q的下//q的下一个元素的前驱指向 //清空删除元素

五、 程序源码

#include

#include

typedef struct number

{

struct number *prior;

int num;

struct number *next;

}number;

number *head; //定义全局变量头节点

int k = 0; //k记录元素个数,防止溢出

void Listcreate(); //建立链表

void Listprint(); //全体输出

void Listlocate(); //查找

void Listinsert_discretion(); //任意位置插入

void Listinsert_order(); //有顺序插入

void Listdelete(); //删除

void main()

{

int select;

printf("1、输入斐波那契数列的个数\n");

printf("2、全部输出数列\n");

printf("3、查找定位数列的元素\n");

printf("4、添加数列元素\n");

printf("5、插入顺序数列元素\n");

printf("6、删除数列元素\n");

printf("-------------------------------------\n");

while (1)

{

printf("请选择序号\n");

scanf("%d", &select);

switch (select)

{

case 1: Listcreate(); break;//链表创建 case 2: Listprint(); break;//全链表输出 case 3: Listlocate(); break; //元素查找

case 4: Listinsert_discretion(); break; //任意位置插入

case 5: Listinsert_order(); break; //有顺序插入

case 6: Listdelete(); break; //删除

default: break;

}

}

}

void Listcreate() //建立链表

{

head = (number *)malloc(sizeof (number)); //开辟一个大小为number的内存空间给头节点

head->next = NULL;

head->prior = NULL;

int a = 1,b = 1; //a、b为斐波那契数列的前两个元素 int i;

number *q;

number *p = head; //p始终指向最后一个节点 printf("输入元素的长度\n");

scanf("%d",&i);

q = (number *)malloc(sizeof (number)); //开辟一个大小为number的内存空间给后面节点

q->num = a;

q->next = NULL; //新开辟的节点指向NULL p->next = q; //前一节点指向新开辟的节点 q->prior = p; //开辟的节点前驱指向p p = p->next; //p指向新节点

i = i - 1;

k = k + 1;

q = (number *)malloc(sizeof (number));

q->num = b;

q->next = NULL;

p->next = q;

q->prior = p;

p = p->next;

i = i - 1;

k = k + 1;

while (i--)

{

q = (number *)malloc(sizeof (number));

q->num = (a+b);

q->next = NULL;

p->next = q;

q->prior = p;

p = p->next;

a = a + b + b; //

b = a - b; //将a+b的值付给b;b的值付给a a = a - b; //

k = k + 1;

}

printf("链表建立成功\n");

}

void Listprint() //全体输出

{

number *p = head->next;

while (p != NULL)

{

printf("%d ", p->num);

p = p->next;

}

printf("\n");

}

void Listlocate() //查找

{

int i;

number *p = head;

printf("输入您要查询的元素位置\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("查询的位置不存在\n");

}

else

{

while (i--)

{

p = p->next;

}

printf("所查找数为%d\n", p->num);

}

}

void Listinsert_discretion() //任意位置插入

{

int i;

number *q;

number *p = head;

printf("输入您要插入哪个元素的后面\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("插入的位置不存在\n");

}

else

{

while (i--)

{

p = p->next; //p最后指向要插入位置的前一个节点 }

q = (number *)malloc(sizeof (number));

if (p->next == NULL) //插到末尾

{

q->next = NULL; //B的下一个元素指向空

p->next = q; //p的下一个元素指向B

q->prior = p; //B的前驱指向p

}

else

{

q->next = p->next; //B的下一个元素指向p的下一个(两个不能反)

p->next->prior = q; //p的下一个元素的前驱指向B p->next = q; //p的下一个元素指向B

q->prior = p; //B的前驱指向p

}

printf("输入您要插入的数\n");

scanf("%d", &(q->num));

k = k + 1;

}

printf("插入成功\n");

}

void Listinsert_order() //有顺序插入

{

number *q;

number *p = head;

q = (number *)malloc(sizeof (number));

printf("输入您要插入哪个数\n");

scanf("%d", &q->num);

while (p->next)

{

if (p->next->num >= q->num) //插在第一个比数大或等于的的数前 {

q->next = p->next;

p->next->prior = q;

p->next = q;

q->prior = p;

k = k + 1;

break;

}

else

{

p = p->next;

}

}

if (p->next == NULL) //插到末尾

{

q->next = NULL;

p->next = q;

q->prior = p;

k = k + 1;

}

printf("插入成功\n");

}

void Listdelete() //删除

{

int i;

number *q;

number *p=head;

printf("输入您要删除哪个元素\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("删除的位置不存在\n");

}

else

{

while (--i) //这里是先减再判断

{

p = p->next; //p指向被删除的元素的前一个元素 }

q = p->next; //q指向被删除的元素

if (q->next == NULL) //删除最后一个元素

{

p->next = NULL;

}

else

{

p->next = q->next; //p的下一个元素指向q的下一个,即跳过被删除元素

q->next->prior = p;

被删除的元素

}

free(q);

k = k - 1;

}

printf("删除成功\n");

}

//q的下一个元素的前驱指向p,也跳过 //清空删除元素

六、 测试结果

1.最初运行程序时,有如下结果:

2.在输入1后,创建长度为10的斐波那契数列,结果如下:

3.在输入2后,显示数列,结果如下:

4.在输入3后,进行查询操作后,结果如下:

5.在输入4后,进行无序插入操作后,结果如下:

6.在输入5后,进行有序插入操作后,结果如下:

7.在输入6后,进行删除操作后,结果如下:

8.输入其他数字的结果:

七、 总结反思

刚做这个题目的时候发现自己结构体和链表学的太浅了,以前学得只是也不能很好的运用。所以我又复习起了结构体和链表。一开始用单链表实现,想自己做,但没有头绪,心里有了惧怕,一直没做出来。看了书本上的几行代码后有了思路,思路也通了。经过代码的编写和调试,运行出来了,感觉很神奇,而且也找回了信心。

后来要求要用双向链表来实现。我知道关键的就那几行代码,弄清楚后,也很快调试出来。

在程序的细节上表现的不是很好,代码变量命名随意,代码书写不规范,在翻看了编码规范后,我改进了代码。时间浪费了,下次要按规定来。在用户界面上不友善,后来加了些printf语句使程序运行界面更加友善了。

13软工转本1 钱剑滨 实验报告

双向链表实验报告

信息工程 系 13软工转本1 日期 2016年03月12日 姓名 钱剑滨 学号 13131116 电话

一、 实验内容

编写关于双向链表操作的C语言程序,要求包含双向链表的创建(生成)、输出(遍历)、查找、任意位置插入、有顺序插入、删除、等。

二、 实验步骤

1.

2.

3.

4. 分析操作所需思路,熟练运用单链表的各种特点。 编写程序,利用函数特性进行操作。 运行程序,纠正错误,对预测结果进行验证。 分析总结单链表的优缺点,并可以做到熟练掌握双向链表的各种操作。

三、 设计概要

1. 本实验包含了7个函数:

a) 主函数main()

b) 创建链表函数Listcreate()

c) 数据输出函数Listprint()

d) 查找数据函数Listlocate()

e) 无序插入函数Listinsert_discretion ()

f) 有序插入函数Listinsert_order

g) 删除数据函数Listdelete()

2. 明确函数的功能;

a) Listcreate() 创建一个可控长度的斐波那契数列的双向链表。 b) Listprint() 将此链表中的数据全部输出。

c) Listlocate() 查找此链表中任意位置元素的值。

d) Listinsert_discretion ()向此链表的某个位置插入一组数据。

e) Listinsert_order() 向数列中插入一个数,使插入后的数列任然有序

f) Listdelete() 将此链表的某个位置的一组数据删除。

四、 程序设计

1. 函数前包含的头文件名、结点类型定义、全局变量和函数声明 #include

#include

typedef struct number //定义结构体

{

struct number *prior;

int num;

struct number *next;

}number;

number *head; //定义全局变量头节点 int k = 0; //k记录元素个数,防止溢出

/*函数声明*/

void Listcreate(); //建立链表

void Listprint(); //全体输出

void Listlocate(); //查找

void Listinsert_discretion(); //任意位置插入

void Listinsert_order(); //有顺序插入

void Listdelete(); //删除

2. 主函数main()

void main()

{

int select;

printf("1、输入斐波那契数列的个数\n");

printf("2、全部输出数列\n");

printf("3、查找定位数列的元素\n");

printf("4、添加数列元素\n");

printf("5、插入顺序数列元素\n");

printf("6、删除数列元素\n");

printf("-------------------------------------\n");

while (1)

{

printf("请选择序号\n");

scanf("%d", &select);

switch (select)

{

case 1: Listcreate(); break; //链表创建 case 2: Listprint(); break; //全链表输出 case 3: Listlocate(); break; //元素查找 case 4: Listinsert_discretion(); break; //任意位置插入

case 5: Listinsert_order(); break; //有顺序插入

case 6: Listdelete(); break; //删除

default: break;

}

}

}

3. 创建链表函数Listcreate()

void Listcreate() //建立链表

{

head = (number *)malloc(sizeof (number)); //开辟一个大小为number的内存空间给头节点

head->next = NULL;

head->prior = NULL;

int a = 1,b = 1; //a、b为斐波那契数列的前两个元素 int i;

number *q;

number *p = head; //p始终指向最后一个节点

printf("输入元素的长度\n");

scanf("%d",&i);

/*给第一个元素赋值*/

q = (number *)malloc(sizeof (number)); //开辟一个大小为number的内存空间给后面节点

q->num = a;

q->next = NULL; //新开辟的节点指向NULL

p->next = q; //前一节点指向新开辟的节点

q->prior = p; //开辟的节点前驱指向p

p = p->next; //p指向新节点

i = i - 1;

k = k + 1;

/*给第二个元素赋值*/

q = (number *)malloc(sizeof (number));

q->num = b;

q->next = NULL;

p->next = q;

q->prior = p;

p = p->next;

i = i - 1;

k = k + 1;

/*给后续元素赋值*/

while (i--)

q = (number *)malloc(sizeof (number));

q->num = (a+b);

q->next = NULL;

p->next = q;

q->prior = p;

p = p->next;

a = a + b + b; //

b = a - b; //将a+b的值付给b;b的值付给a

a = a - b; //

k = k + 1;

}

printf("链表建立成功\n");

}

4. 数据输出函数Listprint()

void Listprint() //全体输出

{

number *p = head->next;

while (p != NULL)

{

printf("%d ", p->num);

p = p->next;

}

printf("\n");

}

5. 查找数据函数Listlocate()

void Listlocate() //查找

{

int i;

number *p = head;

printf("输入您要查询的元素位置\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("查询的位置不存在\n");

}

else

{

while (i--)

{

p = p->next;

}

printf("所查找数为%d\n", p->num);

}

}

6. 无序插入函数Listinsert_discretion()

void Listinsert_discretion() //任意位置插入

{

int i;

number *q;

number *p = head;

printf("输入您要插入哪个元素的后面\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("插入的位置不存在\n");

}

else

{

while (i--)

{

p = p->next; //p最后指向要插入位置的前一个节点 }

q = (number *)malloc(sizeof (number));

if (p->next == NULL) //插到末尾

{

q->next = NULL; //B的下一个元素指向空 p->next = q; //p的下一个元素指向B q->prior = p; //B的前驱指向p

}

else

{

q->next = p->next; //B的下一个元素指向p的下一个(两个不能反)

p->next->prior = q; //p的下一个元素的前驱指向B p->next = q; //p的下一个元素指向B

q->prior = p; //B的前驱指向p

}

printf("输入您要插入的数\n");

scanf("%d", &(q->num));

k = k + 1;

}

printf("插入成功\n");

}

7. 有序插入函数Listinsert_order ()

void Listinsert_order() //有顺序插入

{

number *q;

number *p = head;

q = (number *)malloc(sizeof (number));

printf("输入您要插入哪个数\n");

scanf("%d", &q->num);

while (p->next)

{

if (p->next->num >= q->num) //插在第一个比数大或等于的的数前

{

q->next = p->next;

p->next->prior = q;

p->next = q;

q->prior = p;

k = k + 1;

break;

}

else

{

p = p->next;

}

}

if (p->next == NULL)

{

q->next = NULL;

p->next = q;

q->prior = p;

k = k + 1;

}

printf("插入成功\n");

}

8. 删除数据函数Listdelete ()

void Listdelete() //删除

{

int i;

number *q;

number *p=head;

printf("输入您要删除哪个元素\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("删除的位置不存在\n");

}

else

//插到末尾

{

while (--i) //这里是先减再判断

{

p = p->next; //p指向被删除的元素的前一个元素

}

q = p->next; //q指向被删除的元素

if (q->next == NULL) //删除最后一个元素

{

p->next = NULL;

}

else

{

p->next = q->next;

一个,即跳过被删除元素

q->next->prior = p;

p,也跳过被删除的元素

}

free(q);

k = k - 1;

}

printf("删除成功\n");

}

//p的下一个元素指向q的下//q的下一个元素的前驱指向 //清空删除元素

五、 程序源码

#include

#include

typedef struct number

{

struct number *prior;

int num;

struct number *next;

}number;

number *head; //定义全局变量头节点

int k = 0; //k记录元素个数,防止溢出

void Listcreate(); //建立链表

void Listprint(); //全体输出

void Listlocate(); //查找

void Listinsert_discretion(); //任意位置插入

void Listinsert_order(); //有顺序插入

void Listdelete(); //删除

void main()

{

int select;

printf("1、输入斐波那契数列的个数\n");

printf("2、全部输出数列\n");

printf("3、查找定位数列的元素\n");

printf("4、添加数列元素\n");

printf("5、插入顺序数列元素\n");

printf("6、删除数列元素\n");

printf("-------------------------------------\n");

while (1)

{

printf("请选择序号\n");

scanf("%d", &select);

switch (select)

{

case 1: Listcreate(); break;//链表创建 case 2: Listprint(); break;//全链表输出 case 3: Listlocate(); break; //元素查找

case 4: Listinsert_discretion(); break; //任意位置插入

case 5: Listinsert_order(); break; //有顺序插入

case 6: Listdelete(); break; //删除

default: break;

}

}

}

void Listcreate() //建立链表

{

head = (number *)malloc(sizeof (number)); //开辟一个大小为number的内存空间给头节点

head->next = NULL;

head->prior = NULL;

int a = 1,b = 1; //a、b为斐波那契数列的前两个元素 int i;

number *q;

number *p = head; //p始终指向最后一个节点 printf("输入元素的长度\n");

scanf("%d",&i);

q = (number *)malloc(sizeof (number)); //开辟一个大小为number的内存空间给后面节点

q->num = a;

q->next = NULL; //新开辟的节点指向NULL p->next = q; //前一节点指向新开辟的节点 q->prior = p; //开辟的节点前驱指向p p = p->next; //p指向新节点

i = i - 1;

k = k + 1;

q = (number *)malloc(sizeof (number));

q->num = b;

q->next = NULL;

p->next = q;

q->prior = p;

p = p->next;

i = i - 1;

k = k + 1;

while (i--)

{

q = (number *)malloc(sizeof (number));

q->num = (a+b);

q->next = NULL;

p->next = q;

q->prior = p;

p = p->next;

a = a + b + b; //

b = a - b; //将a+b的值付给b;b的值付给a a = a - b; //

k = k + 1;

}

printf("链表建立成功\n");

}

void Listprint() //全体输出

{

number *p = head->next;

while (p != NULL)

{

printf("%d ", p->num);

p = p->next;

}

printf("\n");

}

void Listlocate() //查找

{

int i;

number *p = head;

printf("输入您要查询的元素位置\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("查询的位置不存在\n");

}

else

{

while (i--)

{

p = p->next;

}

printf("所查找数为%d\n", p->num);

}

}

void Listinsert_discretion() //任意位置插入

{

int i;

number *q;

number *p = head;

printf("输入您要插入哪个元素的后面\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("插入的位置不存在\n");

}

else

{

while (i--)

{

p = p->next; //p最后指向要插入位置的前一个节点 }

q = (number *)malloc(sizeof (number));

if (p->next == NULL) //插到末尾

{

q->next = NULL; //B的下一个元素指向空

p->next = q; //p的下一个元素指向B

q->prior = p; //B的前驱指向p

}

else

{

q->next = p->next; //B的下一个元素指向p的下一个(两个不能反)

p->next->prior = q; //p的下一个元素的前驱指向B p->next = q; //p的下一个元素指向B

q->prior = p; //B的前驱指向p

}

printf("输入您要插入的数\n");

scanf("%d", &(q->num));

k = k + 1;

}

printf("插入成功\n");

}

void Listinsert_order() //有顺序插入

{

number *q;

number *p = head;

q = (number *)malloc(sizeof (number));

printf("输入您要插入哪个数\n");

scanf("%d", &q->num);

while (p->next)

{

if (p->next->num >= q->num) //插在第一个比数大或等于的的数前 {

q->next = p->next;

p->next->prior = q;

p->next = q;

q->prior = p;

k = k + 1;

break;

}

else

{

p = p->next;

}

}

if (p->next == NULL) //插到末尾

{

q->next = NULL;

p->next = q;

q->prior = p;

k = k + 1;

}

printf("插入成功\n");

}

void Listdelete() //删除

{

int i;

number *q;

number *p=head;

printf("输入您要删除哪个元素\n");

scanf("%d", &i);

if ((i > k) || (i

{

printf("删除的位置不存在\n");

}

else

{

while (--i) //这里是先减再判断

{

p = p->next; //p指向被删除的元素的前一个元素 }

q = p->next; //q指向被删除的元素

if (q->next == NULL) //删除最后一个元素

{

p->next = NULL;

}

else

{

p->next = q->next; //p的下一个元素指向q的下一个,即跳过被删除元素

q->next->prior = p;

被删除的元素

}

free(q);

k = k - 1;

}

printf("删除成功\n");

}

//q的下一个元素的前驱指向p,也跳过 //清空删除元素

六、 测试结果

1.最初运行程序时,有如下结果:

2.在输入1后,创建长度为10的斐波那契数列,结果如下:

3.在输入2后,显示数列,结果如下:

4.在输入3后,进行查询操作后,结果如下:

5.在输入4后,进行无序插入操作后,结果如下:

6.在输入5后,进行有序插入操作后,结果如下:

7.在输入6后,进行删除操作后,结果如下:

8.输入其他数字的结果:

七、 总结反思

刚做这个题目的时候发现自己结构体和链表学的太浅了,以前学得只是也不能很好的运用。所以我又复习起了结构体和链表。一开始用单链表实现,想自己做,但没有头绪,心里有了惧怕,一直没做出来。看了书本上的几行代码后有了思路,思路也通了。经过代码的编写和调试,运行出来了,感觉很神奇,而且也找回了信心。

后来要求要用双向链表来实现。我知道关键的就那几行代码,弄清楚后,也很快调试出来。

在程序的细节上表现的不是很好,代码变量命名随意,代码书写不规范,在翻看了编码规范后,我改进了代码。时间浪费了,下次要按规定来。在用户界面上不友善,后来加了些printf语句使程序运行界面更加友善了。


相关内容

  • 电力电子技术实验报告(西电自动化11级千博)
  • 电力电子技术实验报告 机电工程学院自动化 实验一 控制电路及交流调压实验 一.实验目的和要求 本实验是利用单结晶体管来构成的最简单的控制电路.但具有触发电路的四要素,这种电路的中小功率电路中仍广泛使用. 1. 学会制作单结晶体管控制电路,以实现对小功率电力电子电路的控制,通过实验学习触发电路的设计及 ...

  • 生物实验报告-神经传导速度测定
  • 生物实验报告 姓名: 同组者: 班级: 日期: 实验序号: 实验题目:神经干动作电位及其速度测定 坐骨神经干不应期测定 实验目的: 1. 学习神经干标本的制备. 2. 观察坐骨神经干的单相.双相动作电位.双向性传导并测定其传导速度. 3. 观察机械损伤对神经兴奋和传导的影响 4. 学习绝对不应期和相 ...

  • 链表(单链表双向循环)实验报告
  • 数据结构 实验报告 T1223-3-21 余帅 实验一 实验题目: 仅仅做链表部分 难度从上到下 1.双向链表,带表头,线性表常规操作. 2.循环表,带表头,线性表常规操作. 3.单链表,带表头,线性表常规操作. 实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间 ...

  • 电子工艺技术的实现报告
  • 江苏农林职业技术学院 <电子生产工艺> 实训报告 姓 名 葛国栋 学 号 班 级 实训时间 2012.11.19-11.30 指导老师  流水灯的仿真 实现目的: 利用元件连接组成流水灯,能够在Multisim中实现仿真. 实验设计任务和要求: 1.有8只彩灯(用发光二极管代替)组成电 ...

  • 北交大模电实验报告
  • 放大电路失真现象研究 实 验 报 告 班级: 摘要 放大电路广泛应用于很多工程中,放大电路的失真对于电路有较大影响, 因此,研究放大电路的失真问题既具有工程意义,又有利于对放大电路及其失真现象的了解和掌握.本文通过研究基本放大电路出现的非线性失真的原因并且提出消除非线性失真的方法. 关键词: 放大电 ...

  • 温度控制器实验报告
  • 单片机课程设计实验报告 --温度控制器 班级:学号:姓名:老师:合作者: 一. 实验要求和目的 本课程设计的课题是温度控制器. ● 用电压输入的变化来模拟温度的变化,对输入的模拟电压通过 ADC0832转换成数字量输出.输入的电压为0.00V --5.00V ,在三位数码显示管中显示范围为00.0- ...

  • 实验一 发光二极管实验
  • 实验一 发光二极管实验 一.实验目的 1.掌握AT89C51 单片机IO 口的输入输出. 2.掌握用查表方式实现AT89C51 单片机IO 口的控制. 3.练习单片机简单延时子程序的编写. 4.熟练运用Proteus 设计.仿真AT89C51 系统. 二.实验原理 1. 单片机最小系统由单片机芯片. ...

  • 投资银行实验报告
  • 投资银行实验报告 一. 实验目的 1. 了解证券市场行情及运行机制.学习使用证券市场实时行情及分析系统,了解现实市场中交易所的成交定价机制,了解市场预期.市场供求和市场信息对行情的影响,通过实时行情模拟投资体会证券分析和投资的系统性和复杂性 2. 了解我国投资银行业的现状及其作用.通过INTERNE ...

  • 模电课程设计实验报告
  • <模 拟 电 子 技 术> 课程设计报告 系别:机电科学与工程系 专业班级: 小组成员: 学生姓名: 指导教师:王枫陈秀宏 2011年12月31日 河北科技师范学院 欧美学院 目录 一. 实验名称 二. 设计任务及主要技术指标和要求 三. 选题的目的和意义论述 四. 方案的可行性论证 五 ...