這裡蒐索程式師資訊,查找有用的技術資料
当前位置:首页 » 编程语言 » c语言单链adt编程
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言单链adt编程

发布时间: 2022-05-10 04:46:00

1. c语言写ADT的问题

参考c 模板
template,对代码重用很有帮助,特别是那种算法一样,只是数据类型不同〔例如排序〕的代码有很大的用处

2. 数据结构(C语言)单链表的问题

/*
这是结果,需要的话给我个地址
------------------------
***建立含有n个数据元素的带头结点的单链表***
请输入n = 5
请输入第1个元素:1
请输入第2个元素:2
请输入第3个元素:3
请输入第4个元素:4
请输入第5个元素:5
依次输出该表中各元素的值:1 2 3 4 5
将单链表进行逆置运算:
依次输出逆置后表中各元素的值:5 4 3 2 1
Press any key to continue
------------------------------
*/

3. c语言!!!程序设计:建立一个学生信息链表,包括学号,姓名,成绩.(实现添加,删除,查询,排序,平均)

代码如下:

/*用c语言链表编写一个学生信息系统程序,要求输出学生的学号,姓名,性别,学号,姓名,成绩(实现添加,删除,查询,排序,平均)*/

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <stdlib.h>

using namespace std;

const int n=5;

/*

* nodeEntry : 节点数据类型

* nodeADT : 节点结构

* linkADT : 链表结构

*/

typedef struct Student

{

int num;

char name[30];

char sex;

float score1;//语文

float score2;//数学

float score3;//英语

//struct Student *next;

}Student;

typedef struct linkCDT {

nodeADT head;

}*linkADT;

/*

* InitLink : 初始化链表

* CreateNode : 创建节点

* AppendLink : 添加数据

*/

nodeADT CreateNode(Student entry) {

nodeADT p=(nodeADT)malloc(sizeof*p);

p->entry=entry,p->next=0;

return p;

}

/*

SortLink : 排序链表

//按学号排序

void SortLinkID(linkADT link) {

nodeADT pHead,pRear,p,tp;

if (!link) return;

for (pHead=link->head,pRear=0;pHead;pHead=pHead->next) {

for (tp=pHead,p=pHead->next;p;tp=p,p=p->next)

if (pHead->entry.num>=p->entry.num)

tp->next=p->next,p->next=pHead,pHead=p,p=tp;

if (!pRear) link->head=pHead;

else pRear->next=pHead;

pRear=pHead;

}

//按英语成绩排序

void SortLinkEnglish(linkADT link) {

nodeADT pHead,pRear,p,tp;

if (!link) return;

for (pHead=link->head,pRear=0;pHead;pHead=pHead->next) {

for (tp=pHead,p=pHead->next;p;tp=p,p=p->next)

if (pHead->entry.score3>=p->entry.score3)

tp->next=p->next,p->next=pHead,pHead=p,p=tp;

if (!pRear) link->head=pHead;

else pRear->next=pHead;

pRear=pHead;

}

}

//按姓名的字典序进行排序

void SortLinkName(linkADT link) {

nodeADT pHead,pRear,p,tp;

if (!link) return;

for (pHead=link->head,pRear=0;pHead;pHead=pHead->next) {

for (tp=pHead,p=pHead->next;p;tp=p,p=p->next)

if (pHead->entry.name[0]>=p->entry.name[0])

tp->next=p->next,p->next=pHead,pHead=p,p=tp;

if (!pRear) link->head=pHead;

else pRear->next=pHead;

pRear=pHead;

}

}

//按姓名的长度进行排序

void SortLinkNameLength(linkADT link) {

nodeADT pHead,pRear,p,tp;

if (!link) return;

for (pHead=link->head,pRear=0;pHead;pHead=pHead->next) {

for (tp=pHead,p=pHead->next;p;tp=p,p=p->next)

if (strlen(pHead->entry.name)>=strlen(p->entry.name))

tp->next=p->next,p->next=pHead,pHead=p,p=tp;

if (!pRear) link->head=pHead;

else pRear->next=pHead;

pRear=pHead;

}

循环链表是与单链表一样

是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。

循环链表的运算与单链表的运算基本一致。所不同的有以下几点:

1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。

2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。

以上内容参考:网络-链表

4. C语言 ADT列表问题

你的目的:
我看了你的代码,基本上了解你的意图,就是建立单向链表,并循环往链表增加结构体。

你发生错误的原因:
先看看你的代码为什么在第二次增加节点出现错误吧,主要集中在ADDNODE函数内。
第一次 Item *b = (*p) 这个是等于NULL的,然后你再在堆中为 Item *c分配内存。并把a(你在main循环scanf的栈结构数据)指针赋值给c(注意,这里c分配的内存指针丢失,这是个严重的内存泄露)。然后你判断b是否为NULL,第一次当然是NULL了,所以你把c(也就是把*p作为链表头)赋值给*p(其实是错误的)。第一次scanf完成,其实绕了一大圈也就是完成Item **p 内的b=*p=c=&a;然后第二次就执行到了ADDNODE的 { while(b!=NULL) b=b->next;b=c; } 这段代码,为什么第二次出现错误,主要原因就在这里。因为这时b!=null 了,你开始b=b->next,b=c; 你仔细看下循环。因为你在第一次的时候b就相当于等于 &a(main 函数内的Item a),而(&a)->next 是不为NULL.是系统随机分配的一个内存地址,在VC环境一般为0xcccccc.那么b=b->next 这时b就是0xcccccc了,然后b=c,再次循环b又是0xcccccc,然后在b=c,然后b又被赋值0xcccccc......一直到永远(一个大大的死循环)。

总结:
1、你对指针有严重的认识误区
2、你对链表next节点增加指向下一个数据区域的指针模糊,你只知道理论。但不知道如何去实现它。
3、你的代码有很多不太好的习惯。对数据不进行初始化、滥用指针、内存泄露、还有&a的数据被重复覆盖(即使链表构件出来也是全部都是最后一次增加的那个节点的姓名和年龄数据)
4、Item **p 完成是多余的声明和操作,如果你对指向指针的指针不理解,请慎用。从你的代码上来看,你还是不够了解的。
5、你的代码有容错处理(比如在申请内存的时候),看来你是个严谨的人,这个值得提倡。

** 还有 你的代码错误太多,无法给你修改 。如果真想实现,请联系我吧。

5. C语言-ADT列表错误!

// new->item=*item; 注释掉该行
new->next = NULL; //增加这一行 (1)
p->next = NULL; //增加这一行 ,必须设置为null,否则(2)处永远死循环
if(ls->next==NULL)
p->next=new; //因为有 (1) 把next指针设为NULL,所以你下次循环到尾节点增加新节点才有循环到NULL的保证。
else
{
while(ls->next!=NULL) (2)
ls=ls->next;
ls->next=new;
}

*这只能解决你在第二次或N次增加链表的问题。

还有你实现单向链表的想法是 从头节点循环至尾节点把尾节点找到,再在尾节点的next指针上增加新节点(new节点)。这点不好,因为随着你的链表数据的增多,你每次都要循环至尾节点加新的节点。这是个效率较低的方法。

你的程序代码还有其他多处问题。我今天比较忙,有时间再根据你的思路,写段代码给你。你就会明白。

6. 数据结构——C语言:求解题目:为字符串定义一个ADT,要求包含常见的字符串运算,每个运算定义成一个函数。

用C++比较简单。直接重载一下操作符就可以了。

7. c primer plus中讲的adt不太懂 c语言高手帮忙

ADT那一章应该是学完前面的所有东西之后才能看的,如果是挑着看,或许会有疏漏,看起ADT来会有些吃力

视频教程很难找,因为这涉及到数据结构,如果是在网上找数据结构的教程的话,找到的应该难度都很大,所以我建议你先把书看懂,毕竟那是入门,c primer我看过,那一章其实就是代码有点长罢了,难度并不算大

精通C语言要多上机操作,多写代码,多读代码,可以自己找一些生活中的问题,用C加以解决,这样也可以锻炼水平

学C语言的时间因人而异,而且看你到底要往哪个方面发展,如果往单片机或系统底层发展,那就需要非常精通才行。如果往桌面软件方向发展,可以转去学c++(当然,java,c#之类的都是可以的),那样C不需要太精通,语法都弄懂就好了。

8. 为二维数组定义一个ADT,详细而准确地说明可以在此数组上完成的操作,请编程高手解决。

数组实际上就是一组相同数据类型变量。如果一个数组中的一个变量也是一个数组,就构成了二维数组。用同样的方法可以构成多维数组。在使用数组以前需要定义一个数组。可以用一个实例来理解数组。假设在一个程序中要存储100个人的年龄,可以写成下面代码来定义100个整型变量。#include void main()for(i=0;i<=9;i++)}在c语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现c语言程序。利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普通用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。函数是c语言的基本构件,是所有程序活动的舞台。例如:printf,scanf,getch,putch,fopen等都是C语言里面的函数指针是指向内存单元的地址.不同类型的指针指向不同类型的地质单元。如:int a; a=100; 这样就把整型常量赋给了变量a。但是如果写成这样:a=123.33;就会出问题,最后输出变量a的值结果是123。现在说到指针,其实地址值也是一个整型数,如某某变量的地址值为36542,说明这个变量被分配在内存地址值为36542的地方。能不能这样进行推理,既然地址值也是整型数,整型变量正好可以用来存放整型数,那不是一个整型变量可以用来存放地址的值吗。程序写成下面这样: int a,b; a=&b; 很明显,这样写是错误的。原因在于不能简单地把地址理解为整型数。 应有这样的对应关系: 地址值<--->指针; 整型数<--->int 型变量。 所以有这样的说法:“指针就是地址”(指针就是存放地址值的一种数据类型) 下面是一段正确的程序: int a,*p; p=&a; /*把变量a的地址值赋给指针p*/ 答案补充 指针是指向内存单元的地址.不同类型的指针指向不同类型的地质单元。是所指数据类型的地址!指针可以指向数据,也可以指向函数等!

如果帮助到您,请记得采纳为满意答案哈,谢谢!祝您生活愉快! vae.la