哈工大c语数据结构作业
数据结构(c语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版数据结构(C语言版)课后习题答案完整版一、数据结构概述数据结构是计算机科学中一个重要的概念,用来组织和存储数据,使之可以高效地访问和操作。
在C语言中,我们可以使用不同的数据结构来解决各种问题。
本文将提供完整版本的C语言数据结构的课后习题答案。
二、顺序表1. 顺序表的定义和基本操作顺序表是一种线性表,其中的元素在物理内存中连续地存储。
在C 语言中,我们可以通过定义结构体和使用指针来实现顺序表。
以下是顺序表的一些基本操作的答案:(1)初始化顺序表```ctypedef struct{int data[MAX_SIZE];int length;} SeqList;void InitList(SeqList *L){L->length = 0;}```(2)插入元素到顺序表中```cbool Insert(SeqList *L, int pos, int elem){if(L->length == MAX_SIZE){return false; // 顺序表已满}if(pos < 1 || pos > L->length + 1){return false; // 位置不合法}for(int i = L->length; i >= pos; i--){L->data[i] = L->data[i-1]; // 向后移动元素 }L->data[pos-1] = elem;L->length++;return true;}```(3)删除顺序表中的元素```cbool Delete(SeqList *L, int pos){if(pos < 1 || pos > L->length){return false; // 位置不合法}for(int i = pos; i < L->length; i++){L->data[i-1] = L->data[i]; // 向前移动元素 }L->length--;return true;}```(4)查找顺序表中的元素```cint Search(SeqList L, int elem){for(int i = 0; i < L.length; i++){if(L.data[i] == elem){return i + 1; // 找到元素,返回位置 }}return -1; // 未找到元素}```2. 顺序表习题解答(1)逆置顺序表```cvoid Reverse(SeqList *L){for(int i = 0; i < L->length / 2; i++){int temp = L->data[i];L->data[i] = L->data[L->length - 1 - i]; L->data[L->length - 1 - i] = temp;}}```(2)顺序表元素去重```cvoid RemoveDuplicates(SeqList *L){for(int i = 0; i < L->length; i++){for(int j = i + 1; j < L->length; j++){if(L->data[i] == L->data[j]){Delete(L, j + 1);j--;}}}}```三、链表1. 单链表单链表是一种常见的链式存储结构,每个节点包含数据和指向下一个节点的指针。
C语言与数据结构实验指导

C语⾔与数据结构实验指导Harbin Institute of TechnologyC语⾔与数据结构实验指导书刘梅索莹⽥⽂龙哈⼯⼤电⼦与信息⼯程学院电⼦⼯程系实验1 实验平台⼀、实验⽬的1.掌握Microsoft Visual C++ 6.0集成环境的使⽤⽅法。
2.掌握C程序在Microsoft Visual C++ 6.0开发环境中的编辑、编译、链接和运⾏全过程⼆、实验内容1)启动Microsoft Visual C++ 6.0开发环境双击桌⾯应⽤程序图标或“开始”菜单程序组中的Microsoft Visual C++ 6.0应⽤程序,启动VC++,如图所⽰图1.1 VC++初始界⾯2)建⽴C源程序⽂件⽅法1:单击⼯具栏的“新建⽂本⽂件”按钮,打开⽂本⽂件编辑界⾯如下图所⽰图1.2 ⽂本⽂件编辑界⾯⽅法2:执⾏“⽂件”->“新建”命令,如图1.3所⽰,在“⽂件”选项卡下选择C++ Source File ⽂件类型,然后输⼊C源程序⽂件名和保存⽂件,如图1.3所⽰,然后单击“确定”按钮,打开源程序⽂件编辑界⾯,如图1.4所⽰。
注意:输⼊C源程序⽂件名时必须带上扩展“.c”,否则默认创建的是扩展名为“.cpp”的C++⽂件。
3)编辑源⽂件⽅法1:在如图1.2所⽰的⽂本⽂件编辑界⾯中输⼊源程序代码,如图1.5所⽰。
⽅法2:在如图1.4所⽰的C源程序⽂件编辑界⾯中编辑源程序代码,如图1.6所⽰。
图1.3 新建⽂件图1.4 C源程序⽂件编辑界⾯图1.5 ⽂本⽂件编辑界⾯编辑源⽂件图1.6 C源程序编辑界⾯编辑源⽂件4)保存源⽂件源⽂件编辑结束后,执⾏“⽂件”->“保存”命令保存⽂件,⽂本⽂件编辑界⾯中编辑的源⽂件保存时必须在⽂件名后加上扩展名“.c”,否则保存的是扩展名为txt的⽂本⽂件,不能编译运⾏。
5)组件⽂件执⾏“组建”->“组建”命令或直接按F7功能键或单机⼯具栏Build按钮,可以对源⽂件进⾏编译、链接⽽不运⾏该程序。
哈工大 C语言实验报告(答案)

实验1简单C 程序设计2、将下列由程序流程图描述的算法,转换为C 源代码并填写到图1-3b 框中,然后输入计算机并运行后并分析其运行结果(本小题2分)。
图1-3a 程序流程图图1-3bC 源程序3、项目编程(本小题12分)(1)请向计算机输入a,b,c 三个值,经过程序处理后,要求输出其中最大的一个。
/*C 语言源代码*/main(){}项目要求:①画出程序流程图;②根据流程图编写程序图1-4a 程序流程图图1-4b C 源程序(2)请向计算机输入a,b,c 三个值,经过程序处理后,要求按值从小到大输出。
项目要求:①画出程序流程图;②根据流程图编写程序/*输出最大值*/main(){}项目提示:①可采用if结构;②a,b,c由scanf函数输入程序流程图/*将a,b,c三个值由小到大输出*/main(){}1-5a程序流程图图1-5b C源程序(3)编程实现打印下列由字母组成的树形。
说明:本项目编程的知识点是让学生对双重循环语句结构的理解,清楚双重循环的特点(即当外循环变量中的值变化一次时,则内循环变量中的值要变化若干次)。
提示:可用外循环变量代表行数;内循环变量代表需打印字符的个数。
难点:①字符个数是按奇数变化递增②左右边界字符打印的位置图1-6a字母A-G组成的树形/*打印图形*/main(){}图1-6b C源程序(4)设计报选体育科目统计程序设某学校在新生入学时,需报选体育选修科目。
体育科目包括:篮球、排球、体操、兵乓球和网球。
请为某班级(30人)统计报选各体育科目人数。
项目要求:①画出程序流程图;②根据流程图编写源程序项目提示:可采用switch与for结构程序流程图C语言源代码main(){}图1-7a程序流程图图1-7b C 源程序实验2数组与排序五、项目编程(本题12分,每小题4分)1、将下列一组数读入到a 数组中,然后从a数组中找出其中最大的元素并与第一个数互换;然后从a数组中找出最小的元素并与最后一个数互换,而其余元素的位置不变。
哈工大数据结构与算法作业1

哈工大数据结构作业14./*升序创建两个含有整形数据的链表,其中Create函数中调用Insert函数实现升序排列。
再通过Combine函数将两个链表合并,用Print函数输出。
代码如下。
*/#include "stdafx.h"#include <iostream>struct node {int data ;struct node *next ;} ;using namespace std;node* Insert(node *head,node *n)/*数据插入,升序排列*/{node *p1,*p2;p1=p2=head;if(head==NULL){head=n;n->next=NULL;return head;}if(head->data>=n->data) //新结点插入首结点之前{n->next=head;head=n;return head;}//在首结点之后寻找位置插入新结点while(p2->next&&p2->data<n->data){p1=p2;p2=p2->next;}if(p2->data<n->data){p2->next=n;n->next=NULL;}else{n->next=p2;p1->next=n;}return head;}/*创建有序链表*/node * Create(void){node *head,*n;int a ;head=NULL;cout<<"升序插入法产生链表,请输入数据(-1结束):\n";for(cin>>a;a!=-1;cin>>a){n=new node;n->data=a;head=Insert(head,n);}return head;}void Print( node *head){cout<<"链表的结点数据(升序)为:\n";while(head){cout<<head->data<<'\t';head=head->next;}}node * Combine(node *p,node *q){ node *hc,*pc;node *pa,*pb;pa=p->next;pb=q->next;hc=pc=p;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pa=pa->next;pc=pc->next;}else {pc->next=pb;pb=pb->next;pc=pc->next;}}pc->next=pa?pa:pb;return hc;}int main(){node *ha,*hb,*hc;cout<<"链表a添加数据\n";ha=Create();cout<<"链表b添加数据\n";hb=Create();Print(ha);Print(hb);hc=Combine(ha,hb);Print(hc);return 0;}8.XSXXXSSSXXSXXSXXSSSS15.//设置链表结点:struct celltype{Elementtype element;celltype *next;int a; //在结点中设置一个int型a来表示链表元素总数};/*顺时针方向查找:即为普通单向链表的查找。
数据结构C语言版部分习题及答案[2]
![数据结构C语言版部分习题及答案[2]](https://img.taocdn.com/s3/m/e044a021e87101f69e319522.png)
第二章习题与解答一判断题1.线性表的逻辑顺序与存储顺序总是一致的。
2.顺序存储的线性表可以按序号随机存取。
3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。
7.线性表的链式存储结构优于顺序存储结构。
8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。
10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。
二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( ) 。
(A) 一个有限序列,可以为空;(B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空;(D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。
插入一个元素时平均要移动表中的()个元素。
(A) n/2 (B) n+1/2 (C) n -1/2 (D) n3.线性表采用链式存储时,其地址( ) 。
(A) 必须是连续的;(B) 部分地址必须是连续的;(C) 一定是不连续的;(D) 连续与否均可以。
4.用链表表示线性表的优点是()。
(A)便于随机存取(B)花费的存储空间较顺序存储少(C)便于插入和删除(D)数据元素的物理顺序与逻辑顺序相同5.某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间。
(A)单链表(B)双链表(C)单循环链表(D)带头结点的双循环链表6.循环链表的主要优点是( )。
(A)不在需要头指针了(B)已知某个结点的位置后,能够容易找到他的直接前趋(C)在进行插入、删除运算时,能更好的保证链表不断开(D)从表中的任意结点出发都能扫描到整个链表7.下面关于线性表的叙述错误的是( )。
数据结构(C语言版)习题参考答案

数据结构(C语言版)习题参考答案数据结构(C语言版)习题参考答案1. 数据结构简介数据结构是计算机科学中重要的概念之一,它关注如何组织和存储数据,以便有效地进行访问和操作。
C语言是一种广泛应用于数据结构实现的编程语言。
本文将提供一些常见数据结构习题的参考答案,帮助读者理解和掌握数据结构的基本概念与实现。
2. 数组数组是一种线性结构,存储具有相同数据类型的元素。
以下是一些数组习题的参考答案:2.1 统计数组中某个元素出现的次数```int countOccurrences(int arr[], int n, int x) {int count = 0;for (int i = 0; i < n; i++) {if (arr[i] == x) {count++;}}return count;}```2.2 查找数组中的最大值和最小值```void findMinMax(int arr[], int n, int* min, int* max) { *min = arr[0];*max = arr[0];for (int i = 1; i < n; i++) {if (arr[i] < *min) {*min = arr[i];}if (arr[i] > *max) {*max = arr[i];}}}```3. 链表链表是一种动态数据结构,每个节点包含数据和指向下一个节点的指针。
以下是一些链表习题的参考答案:3.1 反转链表```Node* reverseLinkedList(Node* head) {Node* prev = NULL;Node* curr = head;while (curr != NULL) {Node* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;}```3.2 合并两个有序链表```Node* mergeLists(Node* list1, Node* list2) {if (list1 == NULL) {return list2;}if (list2 == NULL) {return list1;}if (list1->data < list2->data) {list1->next = mergeLists(list1->next, list2);return list1;} else {list2->next = mergeLists(list1, list2->next);return list2;}}```4. 栈和队列栈和队列是两种重要的线性数据结构,栈支持后进先出(LIFO),队列支持先进先出(FIFO)。
哈工大C语言spoc作业系统答案

}
Q1246.
#include <stdio.h>
#include <math.h>
main()
{
float a, b, c;
int flag = 1;
scanf("%f,%f,%f", &a, &b , &c);
if (a + b > c && b + c > a && a + c > b)
{
if (fabs(a - b) <= 0.1 || fabs(b - c) <= 0.1 || fabs(c - a) <= 0.1)
else
{
if(a>=60&&a<70) printf("score=%d-->D\n",a);
else
{
if(a>=0&&a<60) printf("score=%d-->E\n",a);
else printf("score=%d is error!\n",a);
}
}
}
}
}
Q1903.
#include <stdio.h>
return 0;
}
Q1300.
#include <stdio.h>
int main()
{
long a;
printf("请输入利润:");
scanf("%ld",&a);
if(a<=100000) printf("奖金是%10.2f",0.1*a);
哈工大数据结构大作业——最小生成树

一、问题描述1.用户手动输入带全图(10个结点);2.通过Prim算法输出对应的最小生成树。
二、方法思路1.关于存储带权图我采用10*10的数组存储。
[i,j]表示第i行j列的元素,存储结点i和j之间的权值;显然,[i,j]=[j,i]。
对于两结点之间不直接相连的情况,用100这个较大权值表示。
对于数组中,[i,i]的情况,也用100表示,因为结点自身到自身的权值不做考虑。
2.关于Prim算法引入集合U和T。
U存放生成树的顶点,T存放生成树的边集。
初值U={1},T=Ø。
选择有最小权的边( u, v),u∈U, v∈(V-U),将v加入U,(u,v)加入T。
重复这一过程,直到U=V。
void Prim( G, T ){T = Ø;U = { 1 };while ( (V –U) != Ø) {设( u, v ) 是使u∈U与v∈(V-U)且权最小的边;T = T∪{ ( u, v ) } ;U = U ∪ { v };}}3.形象表示三、主要数据结构及源程序代码及其注释静态数组:数二维组C用来存储带权图;用一维数组U存储10个结点的最小生成树排序结果;用一维数组M存储第2-10个结点;用一维数组W存储M中的结点到U中结点的最小权值。
#include"stdafx.h"#include<stdio.h>#define n 10//结点数目int main(){int C[n+1][n+1];//存储带权图int e=45;//边数int i,j,m,a;int w;int U[n+1];//存储结点的最小生成树排序int M[n];//存储-10结点int W[n];//存储M中到U中的最小权值int min;int k;int t;for (i=0;i<=n;i++)//结点自身到自身的权值附{for (j=0;j<=n;j++){if(i=j){C[i][i]=100;}}}for(i=0;i<=n;i++)//第行不使用C[0][i]=C[i][0]=100;for(m=1;m<=e;m++)//存储带权图{printf("Input Vertex,Vertex,weight(如果两点不直接相连,输入权值;形式(节点一,节点二,权值)):\n");scanf("%d,%d,%d",&i,&j,&w);getchar();C[i][j]=w;C[j][i]=w;}U[1]=1;for(i=1;i<=n-1;i++)//Prim算法实现M[i]=i+1;for(i=1;i<=n-1;i++){W[i]=C[1][i+1];}for(i=1;i<=n-1;i++){min=W[1];k=1;t=1;while(min==50)//防止最小权值选成已放入U中的结点 {min=W[t+1];k=t+1;t++;}for(j=2;j<=n-1;j++)//选择权值最小结点{if((W[j]<min)&&(W[j]!=50)){min=W[j];k=j;}}U[i+1]=M[k];a=M[k];W[k]=50;//用表示M中已放到U中排序的结点for(j=1;j<=n-1;j++)//修正M中到U中最小权值{if((W[j]!=50)&&(C[j+1][a]<W[j])){W[j]=C[j+1][a];}}}for(i=1;i<=n;i++)printf("%d",U[i]); while(1);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第—部分数据结构第一章绪论计算机应用相当普遍,计算机的应用已不再局限于科学计算,而更多用于控制、管理及数据处理等非数值计算的处理工作。
与此相应,计算机加工处理的对象由纯粹的数值发展到字符、表格和图像等各种具有一定结构的数据,这就给程序设计带来一些新的问题。
为了编写出一个好的程序,必须分析待处理的对象的特性以及各处理对象之间存在的关系。
这就是数据结构学科形成和发展的背景。
1.1 数据结构一般来说,用计算机解决一个问题时,需要经过如下几个步骤:首先要从具体问题中抽象出一个适当的数学模型,然后设计一个对此数学模型进行操作的算法,最后编写出程序直至得到解答。
例l:图书馆的书目检索系统。
当你想借阅一本参考书时,你需要到图书馆去查阅图书目录卡片。
如果利用计算机实现自动检索,则计算机处理的对象便是这些目录卡片上的书目信息,列在卡片上的一本书的书目信息可由登录号、书名、作者名、分类号、出版单位和出版时间等各项组成。
每一本书都有唯一的一个登录号。
在书目自动检索系统中建立一张按登录号顺序排列的书目文件,如图 1.1,这个文件就是书目自动检索系统中的数学模型。
计算机的主要操作就是按照某个特定要求(如给定书名)对书目文件进行查询。
图1.11.2 基本概念1.2.1数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
如数值、字符串、图像、声音都是数据。
1.2.2数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理单位,通常—个数据元素可由若干个数据项组成。
如书目文件中一本书的书目信息就是一个数据元素。
书目信息中的每一项(如书名、作者名)为一个数据项,数据项是不可分割的最小单位。
1.2.3数据对象是性质相同的数据元素的集合,是数据的子集。
1.2.4数据结构简单的说,是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构没有一个明确的定义,它包括三个要素:1. 数据的逻辑结构数据的逻辑结构抽象地反映数据元素之间的逻辑关系,而不管这种逻辑关系在计算机中是如何表示的。
数据的逻辑结构分为线性结构和非线性结构。
若各个数据元素之间的逻辑关系可以用一个线性序列简单的表示出来,则称之为线性结构,否则称为非线性结构。
如书目文件中a表示一个数据元素,书目文i件可表示成(a,2a,3a……n a),所以它是一个线性结构。
1如图二:数据元素之间的逻辑关系不能用一个线性序列表示出来,所以数据的逻辑结构是非线性结构。
2. 数据的存储结构数据的存储结构是逻辑结构在计算机存储器里的实现。
数据的逻辑结构在存储器中的映像应包括数据元素自身值和数据元素之间关系的表示。
这样在存储器中,某个结点有两个域,一个是存放自身值的域,用标识符info 表示这个域;另一个是存放该结点与其它结点关系的域,用标识符1ink 表示这个域。
3. 数据的运算数据的运算是定义在数据的逻辑结构上的,但运算的具体实现要在存储结构上进行。
数据的各种逻辑结构都有相应的运算,常用的运算有检索、插入、删除、更新和排序等。
1.3 主要的数据存储方式数据之间的逻辑关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,相应的得到两种不同的存储结构:顺序存储结构和链式存储结构。
1.3.1顺序存储结构把逻辑上相邻的数据元素存储在物理上相邻的存储单元里。
特点:只有信息域,没有指针域。
可以通过计算直接确定第i 个结点的存储地址1i L -。
10(1)i LL i m -=+-⨯,其中L是第一个结点的存储地址,m是每个结点所占用0的存储单元数。
插入操作和删除操作不方便。
1.3.2链式存储结构链式存储结构就是每个结点至少包括一个指针域,用指针来体现数据元素之间的逻辑关系。
特点:除了有信息域,还有指针域;逻辑上相邻,物理上不必相邻;插人操作和删除操作方便。
1.4C语言简介第二章线性表2.1 线性表1. 定义线性表的逻辑结构是n 个数据元素的有限序列,(n a aa a ⋅⋅⋅⋅⋅⋅321,,),其中0≥n ,0n =称为空表,1a 称为始结点,n a 称为终结点,其余的结点i a 有且仅有一个后继结点1+i a ,有且仅有一个前趋结点1-i a 。
2. 线性表具有以下特性(1)线性表中所有数据元素,其性质是相同的,即数据类型是一致的。
(2)数据元素之间的相对位置是线性的。
3. 对线性表经常进行的一些操作 (l) 查找操作 ● 查找第i 个结点 ● 查找值为x 的结点 (2) 插入操作● 在线性表的第i 个结点前面插入一个新结点 ● 在线性表的第i 个结点后面插入一个新结点 ● 在线性表的值为x 的结点前面插入一个新结点 ● 在线性表的值为x 的结点后面插入一个新结点 (3) 修改操作● 用新结点替换线性表中的第i 个结点●用新结点替换线性表中值为x结点(4) 排列操作●按结点值递增的顺序重新排列线性表的结点●按结点值递减的顺序重新排列线性表的结点这是常见的对线性表进行的几种操作。
2.2 线性表的顺序存储结构用一连续的存储空间依次存储线性表的所有元素。
在C语言中顺序存储的线性表是一个一维数组,这样,在C语言中用如下形式来说明一个顺序存储的线性表。
int node[max];对顺序存储的线性表进行的操作主要有查找、插入和删除。
1.下面是顺序表的查找算法:int find(int x){int i,findi;int flag;findi=0;flag=0;i=0;WHILE( (i<=last-1) &&(!flag)){IF (node[i]= =x){findi=i;flag=1;}ELSEi=i+1;}IF (! flag )findi=-1;RETURN(findi);}2.下面是顺序表的插入算法:首先看一个例子如表,在第四个结点前面插人一个新结点。
首先把单元3到6之间的所有结点向后移动一个单元,空出一个位置,然后将x=100插入到该位置。
下面是在下标号为p 的节点前插入一个新结点的算法:void insert(int p,int x) { int i;IF ( last= =max)/*max 是表的最大长度*/ pr intf(“list is full”); ELSE {FOR( i= last-1;i>=p;i--) node[i+1]:=node[i];node[p]:=x; last:=last+1; } }12 3 4 5 6 7 8 9 101 24 5 6 7 8 9 100 1 2 3 4 5 6 7 8 9 103.下面是顺序表的删除算法首先看一个例子如表,将3号单元结点删除,把单元4到6之间的所有结点向前移动一个单元。
下面是删除一个结点的算法: void delete (int p ){ int i;printf (“position is wrong”); ELSE {FOR( i= p+1; i<=last-1; i++) node[i-1]:=node[i]; last=last-l; }0 1 2 3 4 5 6 7 8 9 100 1 2 3 4 5 6 7 8 9 10}2.3 线性表的链式存储结构1. 单链表线性表的另外一种存储结构是利用指针把线性表中的各个元素依次链接起来形成一个单向链接表。
一个线性表由若干结点组成, 信息域:它用来存放表中的一个元素;指针域:用来存放指向下一个结点的指针。
在C 语言中,结点的类型定义如下:struct {int data;struct node * next;}单向链接表的主要运算有:插入和删除。
计算机存储器中,设置一个空间称为可利用空间,在获得一个新结点时,从可利用空间中取结点,调用语句p=( struct node *)malloc (sizeof(struct node ))来实现。
在删除一个结点时,将空结点归还给可利用空间,调用过程free(p)来实现。
插入位置可能有四种情况(不设特殊表头结点)。
(1)原来的链表是空表,则插入的结点为表头结点和表尾节点;(2)插入位置在表中第一个结点之前,则插入的结点为新的表头结点;(3)插人的位置在表的中间;(4)如果链表中根本不存在所指定的结点,则把新结点作为新的表尾。
下面是对单向链接表进行插人操作的算法:在单向链接表中,值为a的结点前面插入一个新结点。
(struct node *) insertlink(struct node * head;int a, int b) { struct node * q , *p ,*s(新节点);s=( struct node *)malloc (sizeof(struct node ));s—>data=b;IF (head= =NIL){head=s;s—>next=NIL;}ELSE(三种情况){IF (head—>data= =a){s—>next=head;head=s;}ELSE{p=head;WHILE((p—>data!=a) && (p—>next!=NIL)) {q=p;p=p—>next;}IF P—>data=a{q—>next=ss—>next=p;}ELSE{p—>next=s;s—>next=NIL;}}}RETURN(head);}下面是对单向链接表进行删除操作的算法:从单向链接表head中删去值为a的结点;如果找不到,则打印出错信息。
(struct node *)deletelink(struct node * head;int a){ struct node * q , p;IF (head= =NIL)printf(“this is a emptylist”)ELSE{IF (head—>data= =a){p=head;head= head—>next;free(p);}ELSE{p=head;WHILE((p—>data<>a) && (p—>next!=NIL)){q=p ;p=p —>next ;}IF P —>data=a{q —>next= p —>next ;free(p);}ELSEprintf(“no this node in the list ”)}}RETURE(head);}2. 双链表在单链表中通过每一个结点的指针域只能查到该结点的后继结点,不能查到该结点的前趋结点,这样一些操作很不方便,如果采用双链表,就可以克服上述缺点。
在双链表中,每一个结点有两个指针域,有一个线性表(na a a ⋅⋅⋅,,21),它对应的双链表的形式如下:图2.3在C语言中,结点的类型定义如下:struct node{int data;struct node * llink;struct node * rlink;}设某个结点的地址为p,它的前趋结点的地址是p—>llink,它的后继结点的地址是p—>rlink,它的信息域的内容是p—>data。