7-1 C语言程序设计 实验6-1 单向链表的建立

本题目要求实现下面三个函数,实现如下功能:

输入若干个正整数,以-1结束,采取向链表中添加节点的方式来建立一个单向链表。
遍历并输出这个单向链表。

向链表尾部添加节点函数:

struct link *AppendNode(struct link *head,int data);
  • head:链表头节点指针,如果head为NULL,则会新建头节点

  • data:要添加的节点data数值

  • 函数返回:添加过节点后的链表头节点指针

遍历显示链表函数:

void DisplyNode(struct link *head);
  • head :链表头节点指针

删除链表内存函数:

void DeleteMemory(struct link *head);
  • head:链表头节点指针

主函数样例:

#include <stdio.h>
#include <stdlib.h>

struct link
{
    int data;
    struct link *next;
};

struct link *AppendNode(struct link *head,int data);
void DisplyNode(struct link *head);
void DeleteMemory(struct link *head);

int main()
{
    char    c;
    int data = 0;
    struct link *head = NULL;      /* 链表头指针 */
    while (1)
    {
        scanf("%d",&data);
        if (data==-1)
            break;

        head = AppendNode(head,data);/* 向head为头指针的链表末尾添加节点 */
    }
    DisplyNode(head);        /* 显示当前链表中的各节点信息 */
    DeleteMemory(head);           /* 释放所有动态分配的内存 */
    return 0;
}

/*在此实现 struct link *AppendNode(struct link *head,int data); */

/*在此实现 void DisplyNode(struct link *head); */

/*在此实现 void DeleteMemory(struct link *head);*/
#include <stdio.h>
#include <stdlib.h>

struct link
{
    int data;
    struct link *next;
};

struct link *AppendNode(struct link *head,int data);
void DisplyNode(struct link *head);
void DeleteMemory(struct link *head);

int main()
{
    char    c;
    int data = 0;
    struct link *head = NULL;      /* 链表头指针 */
    while (1)
    {
        scanf("%d",&data);
        if (data==-1)
            break;

        head = AppendNode(head,data);/* 向head为头指针的链表末尾添加节点 */
    }
    DisplyNode(head);        /* 显示当前链表中的各节点信息 */
    DeleteMemory(head);           /* 释放所有动态分配的内存 */
    return 0;
}

/*在此实现 struct link *AppendNode(struct link *head,int data); */

/*在此实现 void DisplyNode(struct link *head); */

/*在此实现 void DeleteMemory(struct link *head);*/

 

#include <stdio.h>
#include <stdlib.h>
struct link
{
    int data;
    struct link *next;
};

struct link *AppendNode(struct link *head,int data);
void DisplyNode(struct link *head);
void DeleteMemory(struct link *head);

int main()
{
    char    c;
    int data = 0;
    struct link *head = NULL;      /* 链表头指针 */
    while (1)
    {
        scanf("%d",&data);
        if (data==-1)
            break;

        head = AppendNode(head,data);/* 向head为头指针的链表末尾添加节点 */
    }
    DisplyNode(head);        /* 显示当前链表中的各节点信息 */
    DeleteMemory(head);           /* 释放所有动态分配的内存 */
    return 0;
}
struct link *AppendNode(struct link *head,int data){
    struct link *p=NULL, *q=head;
  
    p=(struct link*)malloc(sizeof(struct link));
    if(p==NULL){
        exit(0);
    }
    if(head==NULL){
        head=p;
    }
    else{
       while(q->next!=NULL){
           q=q->next;
           }
        q->next=p;
    }  
    p->data=data;
    p->next=NULL;
    return head;
}
void DisplyNode(struct link *head){
    struct link*p;
    p=head;
    int i=1;
    while(p!=NULL)
    {
        
        if(i==1){
            printf("%d",p->data);
        }else{
        printf("->%d",p->data);
        }
        i++;
        p=p->next;
    }
}
void DeleteMemory(struct link *head)
{
   struct link *p = NULL;
	struct link *pr = head;
	while(pr!=NULL)
	{
		p = pr;
		pr = pr->next;
		free(p);
	}
}

 

 

  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言课程设计报告 2011~2012学年第2学期 课 程:C语言课程设计 课程设计名称:图书管理系统 2012年05月04日 一、需求分析 为了满足图书管理的要求,通过计算机技术给图书管理人员和读者借、还书带来便利 。使用c语言编写了图书此管理系统。本系统主要实现图书信息管理的功能,通过此系统 可对图书馆库存图书信息进行管理和维护操作。实现了图书馆内管理的几乎所有功能, 包括查询、添加、删除、修改图书信息,以及对图书信息的存档、读取、排序。所设计 的系统以菜单方式工作,为用户提供清晰的使用提示,依据用户的选择来进行各种处理 ,并且在此过程能够尽可能的处理用户使用过程可能出现的异常情况。图书信息包 括作者名、书名、出版社、出版时间、图书编号、价格、借书人姓名、借书人性别、借 书人学号。图书信息的录入和显示要求有一定的规范格式,录入的图书信息用文件形式 保存,并可以对其进行浏览、查询、修改、删除等基本操作。整个程序实现链表操作, 对图书信息的操作逐个地进行。 二、算法设计: 1.设计思想: 整个系统制造的而过程,涉及了较多C语言知识点,对于不同的数据类型、程序控 制结构、数据结构作以分析和总结,并结合这个课题进行综合的应用,在一定程度上做 到了对所学知识融会贯通。进一步加深、巩固了所学的专业的基本理论知识,培养了综 合分析问题、解决问题的能力。在设计程序时,实现了程序的模块化、结构化。在主函 数调用各种子函数,操作界面简单,易操作。 2.设计表示: (1)整个系统除了主函数外,另外还有各种功能函数,利用循环语句do- while()和选择语句switch()实现各个子函数的调用,系统根据输入的数字选项来调用相 应的函数,以实现相应的功能。主函数首先从文件读取信息到链表,以用于后面其 他函数的操作。总体主要实现了图书的录入、存储、查询、添加、删除、修改、排序等 功能。 (2)在主函数选择管理员登录或者学生登录,并且输入正确密码后才可以进入系统 ,若连续3次输入密码错误将会被强制退出。 (3) Create_Books_Doc();这是一个指针函数,它主要实现链表的创建,它返回的时一个 单向链表的头。其他函数调用时只需调用它返回的头即可。Clear();此为清屏操作,在 运行可以随时将屏幕清空。 (4) Print_Book_Doc ();这个函数链表的输出函数,把链表的头传给函数后,可以表格的形式输出整个链表 的所有信息。、 (5)save();这个函数为保存信息到文件的函数,使用时将链表的头传给函数函数可 将整个链表的所有信息存入到磁盘文件。并覆盖掉源文件,以便以后调用。Read()这 个函数为读取文件的函数,将文件的数据读入链表。 (7)search_book1();search_book2();search_book3();search_book4();search_boo k5();这五个函数为查询图书信息函数,它们分别按编号、书名、作者、借书人姓名、借 书人学号进行查询。查询到信息后返回信息所在节点,查询不到则返回空指针。 (8)InsertDoc();Sorting_order1();Sorting_order2();DeleteDoc ();info_change ();这四个函数功能函数,InsertDoc();添加图书信息、Sorting_order1();将图书按 编号排序、Sorting_order2();将图书按价格排序、DeleteDoc ();删除图书信息、info_change ();修改图书信息。调用时将链表头指针传递给函数函数返回经过功能操作后的头指针 。 3.结构体系设计: 以下为部分流程图: 图书管理系统主界面流程图 管理员版图书管理系统流程图 图书查询系统主界面流程图 排序页面 5.设计过程的想法与程序的不足: 总的来说这个程序大致实现题目要求,但是这套程序仍然存在着很多的问题与不 足。比如,程序函数写的有点繁琐,有太多的嵌套,不是那么井然有序,条理清晰, 程序注释也不是很完善,对信息处理功能还有些不足之处,提示信息不明确。还有就是 没能做到模糊查询。 这个系统主要是参照课本手机通讯录模版编写的,同时也得到了老师和同学的一些帮 助。我在做系统的过程也遇到了很多问题,有的是知识不足,有的是考虑不够周全。 事实证明,只靠自己的知识面还是很窄,独立处理问题能力不是很强,以后还要加强对 c语言的学习。 我认为对于C语言编写的程序来说,使用方法大致都是一样的,所以如果要改进的话 ,就是要改进一些算法,尽量把界面编写清楚,提示信息全面,方便易用。 三、调试与测试: 上机操作(部分截图) 系统主界面(选择数字进入,退出系统) 选择1输入密码进入管理员版系统,
以下是用 C 语言单向链表设计的程序,可以实现两个任意超长的正整数求和运算: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ListNode { int val; struct ListNode *next; } ListNode; ListNode* createNode(int val) { ListNode* node = (ListNode*)malloc(sizeof(ListNode)); node->val = val; node->next = NULL; return node; } ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* dummy = createNode(0); ListNode* curr = dummy; int carry = 0; while (l1 || l2 || carry) { int sum = carry; if (l1) { sum += l1->val; l1 = l1->next; } if (l2) { sum += l2->val; l2 = l2->next; } carry = sum / 10; curr->next = createNode(sum % 10); curr = curr->next; } return dummy->next; } int main() { char num1[1000], num2[1000]; printf("请输入两个正整数:\n"); scanf("%s %s", num1, num2); int len1 = strlen(num1), len2 = strlen(num2); ListNode* l1 = NULL, *l2 = NULL; for (int i = len1 - 1; i >= 0; i--) { ListNode* node = createNode(num1[i] - '0'); node->next = l1; l1 = node; } for (int i = len2 - 1; i >= 0; i--) { ListNode* node = createNode(num2[i] - '0'); node->next = l2; l2 = node; } ListNode* res = addTwoNumbers(l1, l2); printf("结果为:"); while (res) { printf("%d", res->val); res = res->next; } printf("\n"); return 0; } ``` 这个程序,我们首先定义了一个链表节点结构体 `ListNode`,包含一个整数值 `val` 和一个指向下一个节点的指针 `next`。然后我们定义了一个 `createNode` 函数,用于创建一个新的节点。接着我们定义了一个 `addTwoNumbers` 函数,用于实现两个链表的求和运算。在这个函数,我们使用了一个虚拟头节点 `dummy`,以及一个指向当前节点的指针 `curr`,来构建结果链表。我们同时遍历两个输入链表 `l1` 和 `l2`,将它们的对应节点的值相加,并加上进位 `carry`,得到当前位的和 `sum`。然后我们将 `sum` 对 10 取模得到当前位的值,并将 `sum` 除以 10 得到进位。我们将当前位的值作为一个新的节点插入到结果链表,并将 `curr` 指向这个新节点。最后,我们返回结果链表的头节点。 在 `main` 函数,我们首先读入两个正整数 `num1` 和 `num2`,然后将它们转换成链表 `l1` 和 `l2`。我们将 `num1` 和 `num2` 的每一位都转换成一个节点,并将这些节点插入到链表的头部。然后我们调用 `addTwoNumbers` 函数,将 `l1` 和 `l2` 作为参数传入,得到结果链表 `res`。最后,我们遍历 `res`,将每个节点的值输出即可。 希望这个程序能够帮助你解决问题!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值