数据结构(C语言)单链表的基本操作

数据结构(C语言)单链表的基本操作
数据结构(C语言)单链表的基本操作

实验名称:实验一单链表的基本操作

实验目的

熟练掌握线性表两类存储结构的描述方法。

实验内容

从键盘读入若干个整数,建一个整数单链表,并完成下列操作:

(1)打印该链表;

(2)在链表中插入一个结点,结点的数据域从键盘读入,打印该链表;

(3)在链表中删除一个结点,被删结点的位置从键盘读入,打印该链表;

(4)在链表中做查找:从键盘读入要查找的整数,将该整数在链表中的位置打印出来,若要查找的整数不在链表中,返回一个信息。

算法设计分析

(一)数据结构的定义

单链表存储结构定义为:

struct Node;

typedef struct Node * pnode;

struct Node {

int info;

pnode link;

};

typedef struct Node * LinkList;

(二)总体设计

程序由主函数、创建单链表函数、链表长度函数、链表打印函数、插入正整数函数、删除函数、查询函数组成。其功能描述如下:

(1)主函数:调用各个函数以实现相应功能

int main(void) //主函数

{

printf("单链表的基本操作实验:\n");

struct list *pnode;

pnode = creat(); //创建

print(pnode); //输出

insert(pnode); //插入

print(pnode); //输出

_delete(pnode); //删除

print(pnode); //输出

_located(pnode); //查找

print(pnode); //输出

return 0 ;

}

(三)各函数的详细设计:

Function1: struct list *creat()//创建链表;

(1):申请表头节点空间

(2):输入-1结束输入;

(3):结点的数据域从键盘读入;

Function2:void print(struct list *pnode)//打印链表;

(1):利用while循环输出结点的数据域;

Function3:void insert(struct list *pnode)//插入;

(1):定义一个整型变量flag 记录当前指定插入的位置;

(2):利用if条件判断念输入的位置是否有效;//

If(position <=0||position>length(pnode))

//当输入的位置小于0或者大于链表的长度时,继续输入,直到输入到正确的值为止;(3):申请一个结点空间(为即将插入的节点);

(4):用q->info 记录插入节点的数据域;

(5):用while(flag!=position)判断插入的位置;

(6):if(t == pnode->next) 判断插入的位置是否为单链表头结点的后面;如果是,直接用q->next = pnode->next;

pnode->next = q;

return ;插入结点;

Function4:void _delete(struct list *pnode)//删除;

(1):用if(position<=0||position>length(pnode)) 判断输入删除的位置是否在允许的范围<0或>点链表的总长度,则重新输入;

(2):while(flag!=position&&p->next!=NULL) 找到需要删除的位置;

(3):找到要删除的结点后,把要删除的结点架空,即可删除该结点;

Fubction5:void _located(struct list *pnode)//查询位置上的数;

Function6:void _located(struct list *pnode)//查询数值所在表的位置;

(1):找到要查询数值的位置

while(flag!=number)

{

p=p->next;

flag=p->info;

position++;

}

(2):若未找到相关数值,则返回not found!

if(!p)

{

printf("not found");

}

实验测试结果及结果分析

(一)测试结果

(二)结果分析

(1)单链表:1 2 3 4 5 6

(2)输入插入的位置为:9,显示无效插入位置

(3)重新输入插入位置3,输入插入值:7,则返回单链表,1 2 7 3 4 5 6

(4)输入删除的位置:8,显示无效删除位置

(5)从新输入删除位置:4;则返回单链表1 2 7 4 5 6

(5)输入查询数值:3;则返回该数值在单链表中的位置:7

实验总结

通过本次的实验我对单链表有了更加深刻的了解,对单链表的删除,插入,打印,查找,等基本的操作有基本的掌握。同事通过自己的多次测试和修改程序代码,明白了许多在之前比较模糊的知识点。

附录实验程序代码

#include

#include

#define N 30

struct list //表结构

{

int info;

struct list *next;

};

//链表创建

struct list *creat()

{

int value; //值(正整数)

struct list *pnode,*p,*q;

pnode = (struct list *)malloc(sizeof(struct list) * N); q = pnode;

printf("输入一个正整数(输入-1退出)"); scanf("%d",&value);

while(value>0) //大于0时循环

{

p=(struct list *)malloc(sizeof(struct list) );

p->info= value;

q->next = p;

q = p;

printf("继续输入正整数(输入-1退出):");

scanf("%d",&value);

}

q->next = NULL;

return pnode;

}

//链表长度

int length(struct list *pnode)

{

int _length = 0;

struct list *p;

p = pnode->next;

while(p!=NULL)

{

_length++;

p=p->next;

}

return _length;

}

//链表打印

void print(struct list *pnode)

{

struct list *p;

p = pnode->next;

while(p!=NULL)

{

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

p=p->next;

}

printf("\n");

}

//插入

void insert(struct list *pnode)

{

struct list *p,*q,*t;

int position;

int insert_value;

int flag = 1; //记录当前是否位于指定插入的位置p = t =pnode->next;

printf("输入插入位置:");

loop: //语句标号

scanf("%d",&position);

if(position<=0||position>length(pnode))

{

printf("无效插入位置!,重新输入:");

goto lop;o

}

printf("输入插入值:");

scanf("%d",&insert_value);

q=(struct list *)malloc(sizeof(struct list));

q->info = insert_value;

while(flag!=position) //

{

t = p;

flag++;

p=p->next;

}

if(t == pnode->next)

{

q->next = pnode->next;

pnode->next = q;

return;

}

q->next = t->next;

t->next = q;

}

//删除

void _delete(struct list *pnode)

{

struct list *p,*t; //表结构

int flag = 0; //同插入标头

int position; //position位置

p = t = pnode;

printf("输入删除位置:");

loop: //语句标号

scanf("%d",&position);

if(position<=0||position>length(pnode)) //length

{

printf("无效删除位置!,重新输入:");

goto loop;

}

while(flag!=position&&p->next!=NULL)

{

t = p;

flag++;

p=p->next;

}

t->next = p->next;

free(p);

}

//查询

void _located(struct list * pnode){

struct list *p,*t;

int flag = 0; //同插入

int position; //position --位置

p = t = pnode;

printf("输入查询位置:");

//读取一个正确的查询数字

loop: //语句标号

scanf("%d",&position);

if(position<=0||position>length(pnode)) //length长度position 位置{

printf("无效查询位置!,重新输入:");

goto loop;

}

while(flag!=position)

{

flag++;

p=p->next;

}

printf("查找的值是:%d\n",p->info);

}

int main(void) //主函数

{

printf("单链表的基本操作实验:\n"); struct list *pnode;

pnode = creat(); //创建

print(pnode); //输出

insert(pnode); //插入

print(pnode); //输出

_delete(pnode); //删除

print(pnode); //输出

_located(pnode); //查找

print(pnode); //输出

return 0 ;

}

数据结构(C语言版)期末复习

数据结构(C语言版)期末复习汇总 第一章绪论 数据结构:是一门研究非数值计算程序设计中的操作对象,以及这些对象之间的关系和操作的学科。 数据结构分为:逻辑结构、物理结构、操作三部分 逻辑结构:集合、线性结构、树形结构、图(网)状结构 物理结构(存储结构):顺序存储结构、链式存储结构 算法:是为了解决某类问题而规定的一个有限长的操作序列。 算法五个特性:有穷性、确定性、可行性、输入、输出 评价算法优劣的基本标准(4个):正确性、可读性、健壮性、高效性及低存储量 语句频度的计算。 算法的时间复杂度: 常见有:O(1),O(n),O(n2),O(log2n),O(nlog2n),O(2n) 第二章线性表 线性表的定义和特点: 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列。线性表中元素个数n(n≥0)定义为线性表的长度,n=0时称为空表。 非空线性表或线性结构,其特点: (1)存在唯一的一个被称作“第一个”的数据元素; (2)存在唯一的一个被称作“最有一个”的数据元素; (3)除第一个之外,结构中的每个数据元素均只有一个前驱; (4)除最后一个之外,结构中的每个数据元素均只有一个后继。 顺序表的插入:共计n个元素,在第i位插入,应移动(n-i+1)位元素。 顺序表的删除:共计n个元素,删除第i位,应移动(n-i)位元素。 线性表的两种存储方式:顺序存储、链式存储。 顺序存储 概念:以一组连续的存储空间存放线性表; 优点:逻辑相邻,物理相邻;可随机存取任一元素;存储空间使用紧凑; 缺点:插入、删除操作需要移动大量的元素;预先分配空间需按最大空间分配,利用不充分;表容量难以扩充; 操作:查找、插入、删除等 查找: ListSearch(SqlList L,ElemType x,int n) { int i; for (i=0;i

(完整版)数据结构(c语言版)期末考试复习试题

《数据结构与算法》(c语言版)期末考复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位

B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。(1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性(2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

C语言链表专题复习

链表专题复习 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个元素大小的数组,有时需要5 0个数组元素的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。 我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向系统要求申请存储空间,决不构成对存储区的浪费。 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面只介绍单向链表。 7.4.1 单链表 图7 - 3是单链表的结构。 单链表有一个头节点h e a d,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N U L L。 图7 - 3还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。 看一下链表节点的数据结构定义: struct node { int num; struct node *p; } ; 在链表节点的定义中,除一个整型的成员外,成员p是指向与节点类型完全相同的指针。 在链表节点的数据结构中,非常特殊的一点就是结构体内的指针域的数据类型使用了未定义成功的数据类型。这是在C中唯一规定可以先使用后定义的数据结构。 ?单链表的创建过程有以下几步: 1 ) 定义链表的数据结构。 2 ) 创建一个空表。 3 ) 利用m a l l o c ( )函数向系统申请分配一个节点。

数据结构C语言版顺序表和单链表的逆置

数据结构C语言版顺序表和单链表的逆置 公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

实验1-1 顺序表的逆置操作 程序原码 #include<> // 创建顺序表,确定元素个数,插入各个元素,逆置列表。#include<> #include<> #define max_list_size 100 //定义给顺序表分配空间大小 typedef struct{ int *elem; int length; }list_node; //指向顺序表首地址的结构体单元 list_node L; //这里使用了全局变量,在所有的函数里可以随意修改其值int list[max_list_size]; void init(); // 初始化操作 void inversion(); // 倒置部分

void creat(); // 建表部分 void display(); // 显示部分 //*************主函数****************** int main() { init(); creat(); printf("\n您输入的顺序表的结点数: \n"); display(); inversion(); printf("\n倒置顺序表的结点数: \n"); display(); } //*************初始化操作分配空间******************

void init() { = (int *) malloc (max_list_size * sizeof(int) ); if (! { printf("顺序表已满"); exit(-1); } = 0; } //*************以下为建表部分****************** void creat(){ int a, b, i; printf("请输入顺序表的结点数: "); scanf("%d", &a); if(a<=0){

(数据结构C语言版)顺序表和单链表的逆置

} 实验 1-1 顺序表的逆置操作 程序原码 // 创建顺序表,确定元素个数,插入各个元素,逆置列表。 #include #define max_list_size 100 //定义给顺序表分配空间大小 typedef struct{ int *elem; int length; }list_node; //指向顺序表首地址的结构体单元 list_node L; // 这里使用了全局变量,在所有的函数里可以随意修改其值 int list[max_list_size]; void init(); void inversion(); void creat(); void display(); //************* 主函数 ****************** int main() { init(); creat(); printf("\n 您输入的顺序表的结点数 : \n"); display(); inversion(); printf("\n 倒置顺序表的结点数 : \n"); display(); void init() { L.elem = (int *) malloc (max_list_size * sizeof(int) ); if (! L.elem) { printf(" 顺序表已满 "); exit(-1); } L.length = 0; #include #include // 初始化操作 // 倒置部分 // 建表部分 // 显示部分 //* ************ 初始化操作分配空间 ******************

《数据结构(C语言版)》复习重点要点

《数据结构(C语言版)》复习重点 重点在二、三、六、七、九、十章,考试内容两大类:概念,算法 第1章、绪论 1. 数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 2. 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 3. 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 其4类基本结构:集合、线性结构、树形结构、图状结构或网状结构 4. 逻辑结构:是数据元素之间的逻辑关系的描述。 5. 物理结构(存储结构):是数据结构在计算机中的表示(又称映像)。 其4种存储结构:顺序存数结构、链式存数结构、索引存数结构、散列存数结构6. 算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。 其5个重要特性:有穷性、确定性、可行性、输入、输出 7. 时间复杂度:算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作,T(n)=O(f(n));他表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐进时间复杂度,简称时间复杂度。例如: (a) {++x;s=0;} (b) for(i=1;i<=n;++i){++x;s += x;} (c) for(j=1;j<=n;++j) for(k=1;k<=n;++k){++x;s += x;} 含基本操作“x增1”的语句的频度分别为1、n和n2,则这3个程序段的时间复杂度分别为O(1)、O(n)和O(n2),分别称为常量阶、线性阶和平方阶。还可呈现对数阶O(log n)、指数阶O(2的n次方)等。 8. 空间复杂度:算法所需存储空间的度量记作,S(n)=O(f(n))。 第2章、线性表 1. 线性表:是最常用最简单的一种数据结构,一个线性表是n个数据元素的有限序列。 2. 线性表的顺序存储结构:是用一组地址连续的存储单元依次存储线性表的数据元素。其特点为逻辑关系上相邻的两个元素在物理位置上也相邻,可以随机存取表中任一元素。 存储位置计算:假设线性表的每个元素需占用L个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置,线性表的第i个数据元素ai的存储位置为LOC(ai)=LOC(a1)+(i-1)*L 式中LOC(a1)是线性表第一个元素a1的存储位置,通常称做线性表的起始位置或基地址。 3. 线性表的链式存储结构:是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。

数据结构C语言版单链表源代码

/*单链表的各种操作*/ #include #include #define null 0 typedef int ElemType; /* 字符型数据*/ struct LNode { ElemType data; struct LNode *next; }; void setnull(struct LNode **p); int length (struct LNode **p); ElemType get(struct LNode **p,int i); void insert(struct LNode **p,ElemType x,int i); void dele(struct LNode **p,int i); void display(struct LNode **p); int locate(struct LNode **p,ElemType x); void main() {

struct LNode *head,*q; /*定义静态变量*/ int select,x1,x2,x3,x4; int i,n; int m,g; char e,y; setnull(&head); /*建设链表并设置为空表*/ printf("请输入数据长度: "); scanf("%d",&n); for(i=1;i<=n;i++) { printf("将数据插入到单链表中: "); scanf("%d",&y); insert(&head,y,i); } /*插入数据到链表*/ display(&head); /*显示链表所有数据*/ printf("select 1 求长度 length()\n"); printf("select 2 取结点 get()\n"); printf("select 3 求值查找 locate()\n"); printf("select 4 删除结点 delete()\n"); printf("select 0 退出\n"); printf("input your select: "); scanf("%d",&select);

数据结构(C语言)单链表的基本操作

实验名称:实验一单链表的基本操作 实验目的 熟练掌握线性表两类存储结构的描述方法。 实验内容 从键盘读入若干个整数,建一个整数单链表,并完成下列操作: (1)打印该链表; (2)在链表中插入一个结点,结点的数据域从键盘读入,打印该链表; (3)在链表中删除一个结点,被删结点的位置从键盘读入,打印该链表; (4)在链表中做查找:从键盘读入要查找的整数,将该整数在链表中的位置打印出来,若要查找的整数不在链表中,返回一个信息。 算法设计分析 (一)数据结构的定义 单链表存储结构定义为: struct Node; typedef struct Node * pnode; struct Node { int info; pnode link; }; typedef struct Node * LinkList; (二)总体设计 程序由主函数、创建单链表函数、链表长度函数、链表打印函数、插入正整数函数、删除函数、查询函数组成。其功能描述如下: (1)主函数:调用各个函数以实现相应功能 int main(void) //主函数 { printf("单链表的基本操作实验:\n"); struct list *pnode; pnode = creat(); //创建 print(pnode); //输出 insert(pnode); //插入 print(pnode); //输出 _delete(pnode); //删除 print(pnode); //输出 _located(pnode); //查找 print(pnode); //输出 return 0 ; } (三)各函数的详细设计: Function1: struct list *creat()//创建链表;

c语言数据结构单链表的交并差集运算实现

数据结构上机实验课 后练习报告 姓名:冯天明 学号: 班级:通信141 2015年9月28日星期一

实验五: 实现A 、B两个单链表表示的集合的交集、并集和差集 实验代码: #include #include #define OK 0 #define ERROR -1 #define OVERFLOW -2 typedefintElemType; typedefstructLNode { ElemType data; //定义数据域 LNode *next; //定义指针域 }LNode,*LinkList; void InitList(LinkList *L) //创建链表头 { *L = ( LinkList )malloc( sizeof(LNode) ); if(!L) exit(OVERFLOW); //头结点内存申请失败 (*L)->next = NULL; } void DerstorList(LinkList&L) //清空链表 { LinkList p; while(L->next)

{ p = L->next; L->next = p->next; free(p); } } void ClearList(LinkList *L,int n) //初始化链表 { LinkListp ; inti; for(i = 0;idata); p->next = (*L)->next; //头插法 ( *L)->next = p; } } void InserList(LinkList *L,ElemType e) //头插法插入数据{ LinkList p; p = (LinkList )malloc(sizeof( LNode )); p->data = e; p->next = (*L)->next; //头插法 ( *L)->next = p; } void DisplaList(LinkList L) //输出链表 {

数据结构C语言版 循环链表表示和实现

数据结构C语言版循环链表表示和实现.txt37真诚是美酒,年份越久越醇香浓烈;真诚是焰火,在高处绽放才愈显美丽;真诚是鲜花,送之于人,手有余香。/* 数据结构C语言版循环链表表示和实现 P35 编译环境:Dev-C++ 4.9.9.2 日期:2011年2月10日 */ #include #include #include typedef int ElemType; // 线性表的单链表存储结构 typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; // 要好好区分什么是头结点((*L)->next),尾结点(*L),以及第一个结 // 点(*L)->next->next,设立尾指针的单循环链表(头尾相接,即头结点 // 与尾结点是一样的,它们都没数据域. // 构造一个空的循环链表L int InitList_CL(LinkList *L) { // 产生头结点,并使L指向此头结点 *L = (LinkList)malloc(sizeof(struct LNode)); if(!*L) exit(0); // 指针域指向头结点,这样就构成了一个循环,空表循环,*L为表尾 (*L)->next = *L; return 1; } // 销毁循环链表L int DestroyList_CL(LinkList *L) { LinkList q, p = (*L)->next; // p指向头结点 while(p != *L) // 没到表尾,*L为表尾 { q = p->next; free(p);

(数据结构C语言版)顺序表和单链表的逆置

实验1-1 顺序表的逆置操作 程序原码 #include // 创建顺序表,确定元素个数,插入各个元素,逆置列表。#include #include #define max_list_size 100 //定义给顺序表分配空间大小 typedef struct{ int *elem; int length; }list_node; //指向顺序表首地址的结构体单元 list_node L; //这里使用了全局变量,在所有的函数里可以随意修改其值 int list[max_list_size]; void init(); // 初始化操作 void inversion(); // 倒置部分 void creat(); // 建表部分 void display(); // 显示部分 //*************主函数****************** int main() { init(); creat(); printf("\n您输入的顺序表的结点数: \n"); display(); inversion(); printf("\n倒置顺序表的结点数: \n"); display(); } //*************初始化操作分配空间****************** void init() { L.elem = (int *) malloc (max_list_size * sizeof(int) ); if (! L.elem) { printf("顺序表已满"); exit(-1); } L.length = 0; }

数据结构c语言章节练习题

数据结构章节练习题 第一章绪论 一、单选题 1.一个数组元素a[i]与________的表示等价。 A、 *(a+i) B、 a+i C、 *a+i D、 &a+i 2.下面程序段的时间复杂度为____________。 for(int i=0; i

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构习题集答案(C语言版严蔚敏) 第2章线性表 2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。 解:头指针是指向链表中第一个结点的指针。首元结点是指链表中存储第一个数据元素的结点。头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。它可以对空表、非空表以及首元结点的操作进行统一处理。 2.2 填空题。 解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。 (2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。单链表中逻辑上相邻的元素的物理位置不一定紧邻。 (3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。 (4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。 2.3 在什么情况下用顺序表比链表好? 解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。 2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。 解: 2.5 画出执行下列各行语句后各指针及链表的示意图。 L=(LinkList)malloc(sizeof(LNode)); P=L; for(i=1;i<=4;i++){ P->next=(LinkList)malloc(sizeof(LNode)); P=P->next; P->data=i*2-1; } P->next=NULL; for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2); for(i=1;i<=3;i++) Del_LinkList(L,i); 解: 2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。 a. 在P结点后插入S结点的语句序列是__________________。 b. 在P结点前插入S结点的语句序列是__________________。 c. 在表首插入S结点的语句序列是__________________。 d. 在表尾插入S结点的语句序列是__________________。 (1) P->next=S; (2) P->next=P->next->next; (3) P->next=S->next; (4) S->next=P->next; (5) S->next=L; (6) S->next=NULL; (7) Q=P; (8) while(P->next!=Q) P=P->next; (9) while(P->next!=NULL) P=P->next; (10) P=Q; (11) P=L; (12) L=S; (13) L=P; 解:a. (4) (1) b. (7) (11) (8) (4) (1) c. (5) (12) d. (9) (1) (6) 2.7 已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。 a. 删除P结点的直接后继结点的语句序列是____________________。 b. 删除P结点的直接前驱结点的语句序列是____________________。 c. 删除P结点的语句序列是____________________。 d. 删除首元结点的语句序列是____________________。

李春葆编著数据结构(C语言篇)习题与解析(用于期末复习)

用于数据结构复习哦!~ 一、绪论 选择题 1.数据结构是一门研究非数值计算的程序设计问题中计算机的1以及它们之间的2和运算等的学科。 1 A.数据元素 B.计算方法 C.逻辑存储 D.数据映像 2 A.结构 B.关系 C.运算 D.算法 2.数据结构被形式地定义为(K, R),其中K是1的有限集,R是K上的2有限集。 1 A.算法 B.数据元素 C.数据操作 D.逻辑结构 2 A.操作 B.映像 C.存储 D.关系 3.在数据结构中,从逻辑上可以把数据结构分成。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4.线性结构的顺序存储结构是一种1的存储结构,线性表的链式存储结构是一种2的存储结构。 A.随机存取 B.顺序存取 C.索引存取 D.散列存取 5.算法分析的目的是1,算法分析的两个主要方面是2。 1 A.找出数据结构的合理性 B.研究算法中的输入和输出的关系 C.分析算法的效率以求改进 D.分析算法的易懂性和文档性 2 A.空间复杂度和时间复杂度 B.正确性和简单性 C.可读性和文档性 D.数据复杂性和程序复杂性 6.计算机算法指的是1,它必须具备输入、输出和2等5个特性。 1 A.计算方法 B.排序方法 C.解决问题的有限运算序列 D.调度方法 2 A.可执行性、可移植性和可扩充性 B.可行性、确定性和有穷性 C.确定性、有穷性和稳定性 D.易读性、稳定性和安全性 7.线性表的逻辑顺序与存储顺序总是一致的,这种说法。 A.正确 B.不正确 8线性表若采用链式存储结构时,要求内存中可用存储单元的地址。 A.必须连续的 B.部分地址必须连续的 C.一定是不续的D连续不连续都可以 9.以下的叙述中,正确的是。 A.线性表的存储结构优于链式存储结构 B.二维数组是其数据元素为线性表的线性表 C.栈的操作方式是先进先出 D.队列的操作方式是先进后出 10.每种数据结构都具备三个基本运算:插入、删除和查找,这种说法。 A.正确 B.不正确 填空题 1.数据逻辑结构包括三种类型、和,树形结构和图形结构合称为。 2.在线性结构中,第一个结点前驱结点,其余每个结点有且只有个前驱结点;最后一个结点后续结点,其余每个结点有且只有个后续结点。 3.在树形结构中,树根结点没有结点,其余每个结点有且只有个前驱结点;叶子结点没有结点,其余每个结点的后续可以。 4.在图形结构中,每个结点的前驱结点数和后续结点数可以。 5.线性结构中元素之间存在关系,树形结构中元素之间存在关系,图形结构中元素之间存在关系。

数据结构(C语言)考试重点必背

第一章:绪论 1.1:数据结构课程的任务是:讨论数据的各种逻辑结构、在计算机中的存储结构以及各种操作的算法设计。 1.2:数据:是客观描述事物的数字、字符以及所有的能输入到计算机中并能被计算机接收的各种集合的统称。 数据元素:表示一个事物的一组数据称作是一个数据元素,是数据的基本单位。 数据项:是数据元素中有独立含义的、不可分割的最小标识单位。 数据结构概念包含三个方面:数据的逻辑结构、数据的存储结构的数据的操作。 1.3数据的逻辑结构指数据元素之间的逻辑关系,用一个数据元素的集合定义在此集合上的若干关系来表示,数据结构可以分为三种:线性结构、树结构和图。 1.4:数据元素及其关系在计算机中的存储表示称为数据的存储结构,也称为物理结构。 数据的存储结构基本形式有两种:顺序存储结构和链式存储结构。 2.1:算法:一个算法是一个有穷规则的集合,其规则确定一个解决某一特定类型问题的操作序列。算法规则需满足以下五个特性: 输入——算法有零个或多个输入数据。 输出——算法有一个或多个输出数据,与输入数据有某种特定关系。 有穷性——算法必须在执行又穷步之后结束。 确定性——算法的每个步骤必须含义明确,无二义性。 可行性——算法的每步操作必须是基本的,它们的原则上都能够精确地进行,用笔和 纸做有穷次就可以完成。 有穷性和可行性是算法最重要的两个特征。 2.2:算法与数据结构:算法建立数据结构之上,对数据结构的操作需用算法来描述。 算法设计依赖数据的逻辑结构,算法实现依赖数据结构的存储结构。 2.3:算法的设计应满足五个目标: 正确性:算法应确切的满足应用问题的需求,这是算法设计的基本目标。 健壮性:即使输入数据不合适,算法也能做出适当的处理,不会导致不可控结 高时间效率:算法的执行时间越短,时间效率越高。果。

数据结构(C语言)【经典题库】含答案

《数据结构与算法》复习题 选择题 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构 B.数据结构 C.数据的逻辑结构 D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑 B.存储 C.逻辑和存储 D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。A.数据的处理方法 B.数据元素的类型 C.数据元素之间的关系 D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何 B.结点个数的多少 C.对数据有哪些运算 D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。

A.数据项是数据的基本单位 B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。(1)A.找出数据结构的合理性 B.研究算法中的输入和输出的关系 C.分析算法的效率以求改进 C.分析算法的易读性和文档性 (2)A.空间复杂度和时间复杂度 B.正确性和简明性 C.可读性和文档性 D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是 O(n2) 。 s =0; for( I =0; i

数据结构单链表及插入删除C语言

数据结构单链表及插入删除C语言 #include #include typedef struct LinkLode{ int data; struct LinkLode* link; }LinkLode; int length; void show(LinkLode* first) { first=first->link; while(first->link!=NULL) { printf("%d ",first->data); first=first->link; } printf("%d\n",first->data); } LinkLode* newLode(int data) { LinkLode *newLode; newLode=(LinkLode *)malloc(sizeof(LinkLode)); newLode->data=data; newLode->link=NULL; return newLode; } void createList(LinkLode* first) { LinkLode*s1,*s2; int i=2; s2=newLode(1); first->link=s2; s1=s2; for(;i<11;i++) { s2=newLode(i); s1->link=s2; s1=s2; } length=10; s1=first->link; while(s1->link!=NULL) {

printf("%d ",s1->data); s1=s1->link; } printf("%d\n",s1->data); } void intList(int i,int data,LinkLode* first) { LinkLode *s1=first,*s2; int i2=0; s2=newLode(data); if(i>=0&&i<=length) { while(i2link; i2++; } s2->link=s1->link; s1->link=s2; length++; printf("插入成功\n"); show(first); } else printf("插入失败\n"); } void delList(int i,LinkLode* first) { LinkLode* s2=first,*s1; int i1=0; if(i>0&&i<=length) { while(i1link; i1++; } printf("删除的数为:%d,地址为%p\n",s2->data,s2); s1->link=s2->link; free(s2); length--; show(first); }

单链表数据结构C语言

单链表的建立(头插法) 写一算法用头插法建立无头结点的单链表,结果返回单链表的头指针typedef char DataType; typedef struct node{ DataType data; struct node *next;}ListNode; typedef ListNode *LinkList; LinkList CreateListF(void) { char ch; LinkList head; ListNode *s; head=NULL; ch=getchar(); while(ch!='\n') {s=(ListNode*)malloc(sizeof(ListNode)); s->data=ch; s->next=head; head=s; ch=getchar(); } return(head); } 单链表的打印 写一算法打印不带头结点的单链表head中每个结点的值 typedef char DataType; typedef struct node{ DataType data; struct node *next;}ListNode; typedef ListNode *LinkList; void PrintList(LinkList head) {ListNode *p; for(p=head;p;p=p->next) printf("%c",p->data); printf("\n"); } 单链表的建立(尾插法) 写一算法用尾插法建立无头结点的单链表,结果返回单链表的头指针typedef char DataType; typedef struct node{ DataType data; struct node *next;}ListNode;

数据结构(c语言版)

数据结构复习资料 1. 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和运算等的学科。 2. 数据结构被形式地定义为(D, R),其中D是数据元素的有限集合,R是D上的关系有限集合。 3. 数据结构包括数据的逻辑结构、数据的存储结构和数据的运算这三个方面的内容。 4. 数据结构按逻辑结构可分为两大类,它们分别是线性结构和非线性结构。 5. 线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。 6.在线性结构中,第一个结点没有前驱结点,其余每个结点有且只有 1个前驱结点;最后一个结点没有后续结点,其余每个结点有且只有1个后续结点。 7. 在树形结构中,树根结点没有前驱结点,其余每个结点有且只有1个前驱结点;叶子结点没有后续结点,其余每个结点的后续结点数可以任意多个。 8. 在图形结构中,每个结点的前驱结点数和后续结点数可以任意多个。 9.数据的存储结构可用四种基本的存储方法表示,它们分别是顺序、链式、索引和散列。 10. 数据的运算最常用的有5种,它们分别是插入、删除、修改、查找、排序。 11. 一个算法的效率可分为时间效率和空间效率。 12. 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与表长和该元素在表中的位置有关。 13. 线性表中结点的集合是有限的,结点间的关系是一对一的。 14. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动n-i+1 个元素。 15. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动n-i 个元素。 16. 在顺序表中访问任意一结点的时间复杂度均为 O(1),因此,顺序表也称为随机存取的数据结构。 17. 顺序表中逻辑上相邻的元素的物理位置必定相邻。单链表中逻辑上相邻的元素的物理位置不一定相邻。

数据结构(第4版)习题及实验参考答案 数据结构复习资料完整版(c语言版)

数据结构基础及深入及考试 复习资料 习题及实验参考答案见附录 结论 1、数据的逻辑结构是指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。 2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机。存储结构可分为4大类:顺序、链式、索引、散列 3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。它由基本的数据类型构成,并包括一组相关的服务(或称操作)。它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。 4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。 5、在数据结构中,从逻辑上可以把数据结构分成( C ) A、动态结构和表态结构 B、紧凑结构和非紧凑结构 C、线性结构和非线性结构 D、内部结构和外部结构 6、算法的时间复杂度取决于( A ) A、问题的规模 B、待处理数据的初态 C、问题的规模和待处理数据的初态线性表 1、线性表的存储结构包括顺序存储结构和链式存储结构两种。 2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为( E ),删除一个元素需要移动的元素的个数为( A )。 A、(n-1)/2 B、n C、n+1 D、n-1 E、n/2 F、(n+1)/2 G、(n-2)/2 3、“线性表的逻辑顺序与存储顺序总是一致的。”这个结论是( B ) A、正确的 B、错误的 C、不一定,与具体的结构有关 4、线性表采用链式存储结构时,要求内存中可用存储单元的地址( D ) A、必须是连续的 B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以 5、带头结点的单链表为空的判定条件是( B ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 6、不带头结点的单链表head为空的判定条件是( A ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 7、非空的循环单链表head的尾结点P满足( C ) A、p->next==NULL B、p==NULL C、p->next==head D、p==head 8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是(B ) A、O(1) B、O(n) C、O(n2) D、O(nlog2n)

相关文档
最新文档