《C语言及程序设计》实践项目——链表初步

    xiaoxiao2025-11-15  12

    返回:贺老师课程教学链接

    【项目1-链表的合并】 输入一个整数m,表示A链表的长度,再输入m个数作为A链表中的m个数据元素,建立链表A,其头指针为heada。输入一个整数n,表示B链表的长度,再输入n个数表示B链表中的n个数据元素,建立链表B,其头指针为headb。输入i、len、j,将要从单链表A中删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个元素之前。最后输出操作后的链表B。 例如,输入:

    11 13 5 14 62 3 43 71 5 72 34 5 (11个数构成链表A) 15 5 20 3 53 7 81 5 42 6 8 4 6 9 10 23(15个数构成链表B ) 1 3 5(从单链表A中删除自第1个元素起的共3个元素,然后将单链表A插入到单链表B的第5个元素之前)

    输出:

    5 20 3 53 62 3 43 71 5 72 34 5 7 81 5 42 6 8 4 6 9 10 23

    [参考解答]


    【项目2-拆分链表】 编写一个函数将一个头指针为a的单链表A分解成两个单链表A和B,其头指针分别为a和b,使得A链表中含有原链表A中序号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。例,建立长度为7,元素为1 2 3 4 5 6 7的链表后,经拆分,得到两个数组A和B,其元素分别是1 3 5 7 和2 4 6

    [参考解答]


    【项目3 - 改造链表】 下面是一个建立动态链表的程序。阅读程序,然后按要求改造程序。

    #include <iostream> using namespace std; #include <stdio.h> #include <malloc.h> #define N 5 typedef struct NODE { int data; //结点的数据 struct NODE *next; //指向下一结点 } Node; Node *head=NULL; //将链表头定义为全局变量,以便于后面操作 void make_list(); //建立链表 void out_list(); //输出链表 int main( ) { make_list(); out_list(); return 0; } void make_list() { int n; Node *p; printf("输入若干正数(以0或一个负数结束)建立链表:" ); scanf("%d", &n); while(n>0) //输入若干正数建立链表,输入非正数时,建立过程结束 { p=(Node*)malloc(sizeof(Node)); //新建结点 p->data=n; p->next=head; //新建的结点指向原先的链表头 head=p; //链表头赋值为新建的节点,这样,新结点总是链表头 scanf("%d", &n); //输入下一个数,准备建立下一个结点 } return; } void out_list() { Node *p=head; printf("链表中的数据为:\n"); while(p!=NULL) { printf("%d ", p->data); p=p->next; } printf("\n"); return; }

    在上面的程序基础上定义下面的函数,实现相应的功能。 为简便起见,每编写一个函数,立刻在main函数中调用进行测试。 (1)编写make_list2()函数建立链表,使建立链表时,后输入的数据,将新输入的数字对应的结点放在链表末尾。若输入为3 5 2 9 4 7 0,建立的链表为: (2)编写函数void search(int x),输出链表中是否有值为x的结点。 (3)编写函数delete_first_node(),删除链表中的第一个结点。 (4)编写函数delete_node(int x),删除结点值为x的结点。 (5)编写make_list3()函数建立链表,使建立链表时,使结点中的数据呈现升序。若输入为3 5 2 9 4 7 0,建立的链表为: (6)编写函数void insert(int x),将值为x的结点插入到由make_list3建立起来的有序链表中。

    [参考解答]


    【项目4-链表版通信录】 利用链表存储数据,写一个通信录程序,能够记录多个联系人的编号、姓名、性别、联系电话、地址,完成数据的录入、添加、删除、修改以及查询功能。 [参考解答]

    相关资源:单片机编程,链表菜单
    最新回复(0)