数据结构 图基本操作代码

合集下载

数据结构经典题目及c语言代码

数据结构经典题目及c语言代码

数据结构经典题目及c语言代码一、线性表1. 顺序表顺序表是一种利用连续存储空间存储元素的线性表。

以下是一个顺序表的经典题目及C语言代码实现:```c#define MaxSize 50typedef struct {int data[MaxSize]; // 存储元素的数组int length; // 顺序表的当前长度} SeqList;// 初始化顺序表void initList(SeqList *L) {L->length = 0;}// 插入元素到指定位置void insert(SeqList *L, int pos, int elem) {if (pos < 1 || pos > L->length + 1) {printf("插入位置无效\n");return;}if (L->length == MaxSize) {printf("顺序表已满,无法插入\n"); return;}for (int i = L->length; i >= pos; i--) { L->data[i] = L->data[i - 1];}L->data[pos - 1] = elem;L->length++;}// 删除指定位置的元素void delete(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("删除位置无效\n");return;}for (int i = pos - 1; i < L->length - 1; i++) {L->data[i] = L->data[i + 1];}L->length--;}// 获取指定位置的元素值int getElement(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("位置无效\n");return -1;}return L->data[pos - 1];}```2. 链表链表是一种利用非连续存储空间存储元素的线性表。

数据结构-队列基本运算的实现及其应用

数据结构-队列基本运算的实现及其应用

数据结构-队列基本运算的实现及其应用篇一数据结构-队列基本运算的实现及其应用一、队列的基本概念队列是一种特殊的数据结构,它遵循先进先出(FIFO)的原则,即先进入队列的元素先出队列。

在队列中,新元素被添加到队列的末尾,而删除操作总是发生在队列的开头。

队列常用于解决各种问题,如处理事件、任务调度、缓冲处理等。

二、队列的基本操作队列的基本操作包括入队(enqueue)、出队(dequeue)、查看队首元素(peek)和判断队列是否为空。

入队操作:向队列的末尾添加一个新元素。

这个操作的时间复杂度通常为O(1),可以通过在队列的末尾添加元素来实现。

出队操作:删除队列开头的元素并返回它。

这个操作的时间复杂度通常为O(1),可以通过移除队列开头的元素来实现。

查看队首元素:返回队列开头的元素但不删除它。

这个操作的时间复杂度通常为O(1),可以通过返回队列开头的元素来实现。

判断队列是否为空:检查队列是否包含任何元素。

这个操作的时间复杂度通常为O(1),可以通过比较队列的长度和0来实现。

三、队列的实现队列可以通过不同的数据结构来实现,如数组、链表和循环列表等。

在这里,我们将介绍使用数组和链表来实现队列的基本操作。

使用数组实现队列使用数组实现队列时,我们需要保留一个空间来跟踪队列的开头和结尾。

通常,我们使用两个指针,一个指向队列的开头,另一个指向队列的结尾。

当我们在队列中添加一个新元素时,我们将它添加到结尾指针所指向的位置,并将结尾指针向后移动一位。

当我们要删除一个元素时,我们只需将开头指针向后移动一位并返回该位置的元素即可。

使用链表实现队列使用链表实现队列时,我们通常使用一个头指针指向队首元素,一个尾指针指向队尾元素的下一个位置。

入队操作时,我们在尾指针的位置创建一个新节点,并将尾指针移动到下一个位置。

出队操作时,我们只需删除头指针指向的节点,并将头指针移动到下一个位置。

四、队列的应用队列在计算机科学中有着广泛的应用,下面列举几个常见的例子:事件处理:在多线程编程中,队列经常用于事件驱动的系统来传递事件或消息。

数据结构上机实验源代码

数据结构上机实验源代码

数据结构上机实验源代码栈的应用十进制数转换为八进制数,逆序输出所输入的数实验代码://stack.h,头文件class stack{public:stack();bool empty()const;bool full()const;error_code gettop(elementtype &x)const;error_code push(const elementtype x);error_code pop();private:int count;elementtype data[maxlen];};stack::stack(){count=0;}bool stack::empty()const{return count==0;}bool stack::full()const{return count==maxlen;}error_code stack::gettop(elementtype &x)const{if(empty())return underflow;else{x=data[count-1];return success;}}error_code stack::push(const elementtype x){if(full())return overflow;data[count]=x;count++;return success;}error_code stack::pop(){if(empty())return underflow;count--;return success;}//主程序#include<iostream.h>enum error_code{overflow,underflow,success};typedef int elementtype;const int maxlen=20;#include"stack.h"void read_write() //逆序输出所输入的数{stack s;int i;int n,x;cout<<"please input num int n:";cin>>n;for(i=1;i<=n;i++){cout<<"please input a num:";cin>>x;s.push(x);}while(!s.empty()){s.gettop(x);cout<<x<<" ";s.pop();}cout<<endl;}void Dec_to_Ocx(int n) //十进制转换为八进制{stack s1;int mod,x;while(n!=0){mod=n%8;s1.push(mod);n=n/8;}cout<<"the ocx of the dec is:";while(!s1.empty()){s1.gettop(x);cout<<x;s1.pop();}cout<<endl;}void main(){int n;// read_write();cout<<"please input a dec:";cin>>n;Dec_to_Ocx(n);}队列的应用打印n行杨辉三角实验代码://queue.hclass queue{public:queue(){count=0;front=rear=0;}bool empty(){return count==0;}bool full(){return count==maxlen-1;}error_code get_front(elementtype &x){if(empty())return underflow;x=data[(front+1)%maxlen];return success;}error_code append(const elementtype x){if(full())return overflow;rear=(rear+1)%maxlen;data[rear]=x;count++;return success;}error_code serve(){if(empty())return underflow;front=(front+1)%maxlen;count--;return success;}private:int count;int front;int rear;int data[maxlen];};//主程序#include<iostream.h>enum error_code{overflow,underflow,success};typedef int elementtype;const int maxlen=20;#include"queue.h"void out_number(int n) //打印前n行的杨辉三角{int s1,s2;int i;int j;int k;queue q;for(i=1;i<=(n-1)*2;i++)cout<<" ";cout<<"1 "<<endl;q.append(1);for(i=2;i<=n;i++){s1=0;for(k=1;k<=(n-i)*2;k++)cout<<" ";for(j=1;j<=i-1;j++){q.get_front(s2);q.serve();cout<<s1+s2<<" ";q.append(s1+s2);s1=s2;}cout<<"1 "<<endl;q.append(1);}}void main(){int n;cout<<"please input n:";cin>>n;out_number(n);}单链表实验实验目的:实验目的(1)理解线性表的链式存储结构。

数据结构全部代码

数据结构全部代码

引言:数据结构是计算机科学中非常重要的一门基础课程,它涉及到用于组织、管理和存储数据的各种方法和技术。

数据结构的学习对于编程和算法的理解至关重要。

本文将深入讨论数据结构的各种代码实现,包括数组、链表、树、堆以及图等。

概述:数据结构的代码实现是指将数据结构的抽象概念转化为实际的编程实现。

这些代码实现提供了一种将数据组织在计算机存储中的方法,并且支持各种对数据的操作。

下面将分别介绍数组、链表、树、堆以及图的代码实现。

正文内容:1.数组1.1创建数组1.2访问数组元素1.3修改数组元素1.4插入元素到数组中1.5从数组中删除元素2.链表2.1单链表的实现2.1.2在链表头部插入节点2.1.3在链表尾部插入节点2.1.4在指定位置插入节点2.1.5从链表中删除节点2.2双链表的实现2.2.1创建双链表节点2.2.2在链表头部插入节点2.2.3在链表尾部插入节点2.2.4在指定位置插入节点2.2.5从链表中删除节点3.树3.1二叉树的实现3.1.1创建二叉树节点3.1.2在二叉树中插入节点3.1.3从二叉树中删除节点3.1.4遍历二叉树3.1.5搜索二叉树中的某个元素3.2AVL树的实现3.2.2在AVL树中插入节点3.2.3从AVL树中删除节点3.2.4平衡AVL树3.2.5遍历AVL树4.堆4.1最大堆的实现4.1.1创建最大堆4.1.2插入元素到最大堆4.1.3从最大堆中删除元素4.1.4获取最大堆的最大值4.1.5堆排序4.2最小堆的实现4.2.1创建最小堆4.2.2插入元素到最小堆4.2.3从最小堆中删除元素4.2.4获取最小堆的最小值4.2.5堆排序5.图5.1邻接矩阵的实现5.1.1创建邻接矩阵5.1.2在邻接矩阵中插入边5.1.3从邻接矩阵中删除边5.1.4遍历邻接矩阵5.1.5判断两个节点是否相邻5.2邻接表的实现5.2.1创建邻接表5.2.2在邻接表中插入边5.2.3从邻接表中删除边5.2.4遍历邻接表5.2.5判断两个节点是否相邻总结:。

数据结构顺序表代码

数据结构顺序表代码

数据结构顺序表代码很高兴回答这个问题。

关于数据结构的顺序表代码,我们需要先了解什么是顺序表以及其特点和常用操作。

顺序表是一种基于数组实现的线性数据结构,其特点是元素在内存中是连续存储的,可以支持快速随机访问,但插入和删除元素比较麻烦。

下面是一份简单的顺序表代码:```#define MAXSIZE 100 //定义顺序表的最大长度typedef struct {int data[MAXSIZE]; //用数组存储顺序表的元素int length; //顺序表的当前长度} SeqList;// 初始化顺序表void InitList(SeqList *L){memset(L->data, 0, sizeof(L->data)); //初始化所有元素为0L->length = 0; //长度为0}// 插入元素bool ListInsert(SeqList *L, int pos, int val){if(pos < 1 || pos > L->length + 1 || L->length == MAXSIZE) //判断是否越界或者表满return false;for(int i = L->length; i >= pos; i--) //从后向前移动元素L->data[i] = L->data[i - 1];L->data[pos - 1] = val; //插入新元素L->length++; //长度加1return true;}// 删除元素bool ListDelete(SeqList *L, int pos){if(pos < 1 || pos > L->length) //判断是否越界return false;for(int i = pos - 1; i < L->length - 1; i++) //从前向后移动元素 L->data[i] = L->data[i + 1];L->length--; //长度减1return true;}// 查找元素int LocateElem(SeqList L, int val){for(int i = 0; i < L.length; i++){ //遍历顺序表找到元素 if(L.data[i] == val)return i + 1;}return 0;}// 获取元素int GetElem(SeqList L, int pos){if(pos >= 1 && pos <= L.length) //判断是否越界 return L.data[pos - 1];elsereturn -1;}// 输出顺序表void PrintList(SeqList L){for(int i = 0; i < L.length; i++)printf("%d ", L.data[i]); //输出每个元素printf("\n");}```以上就是一个简单的顺序表代码实现,包括初始化、插入、删除、查找、获取和输出操作。

数据结构课程设计代码

数据结构课程设计代码

数据结构课程设计代码根据提供的输入输出需求,下面是一个示例的数据结构课程设计代码。

```pythonclass Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef add(self, data):new_node = Node(data)if self.head is None:self.head = new_nodeelse:current = self.headwhile current.next is not None:current = current.nextcurrent.next = new_nodedef remove(self, data):current = self.headprev = Nonewhile current is not None:if current.data == data:if prev is None:self.head = current.next else:prev.next = current.next returnprev = currentcurrent = current.nextdef display(self):current = self.headwhile current is not None:print(current.data, end=" ")current = current.nextprint()if __name__ == "__main__":linked_list = LinkedList()while True:print("1. Add element")print("2. Remove element")print("3. Display elements")print("4. Quit")choice = input("Enter your choice: ")if choice == "1":data = input("Enter element to add: ")linked_list.add(data)elif choice == "2":data = input("Enter element to remove: ")linked_list.remove(data)elif choice == "3":linked_list.display()elif choice == "4":breakelse:print("Invalid choice")```这个代码示例实现了一个简单的链表数据结构,在命令行中提供了添加元素、删除元素和显示元素的选项。

数据结构二叉树的基本操作代码

数据结构二叉树的基本操作代码

数据结构二叉树的基本操作代码x#include<iostream>using namespace std;//二叉树的结构struct TreeNode{int data;//节点的值TreeNode *left;//指向左子树TreeNode *right;//指向右子树};//插入节点void insert(TreeNode *&tree, int val){if(tree == NULL){tree = new TreeNode;tree->data = val;tree->left = tree->right = NULL;}else if(val<=tree->data)//小于根节点的值则插入到左子树 insert(tree->left, val);else if(val>tree->data)//大于根节点的值则插入到右子树 insert(tree->right,val);}//查找节点TreeNode* find(TreeNode *tree,int val){if (tree == NULL)//树为空,无法查找return NULL;else if (val == tree->data)//值和节点的值相等,返回该节点return tree;else if (val < tree->data)//值小于节点的值,查找左子树 return find(tree->left,val);else if (val > tree->data)//值大于节点的值,查找右子树 return find(tree->right,val);elsereturn NULL;//无法查找}//遍历二叉树//先序遍历void preOrder(TreeNode *tree){if(tree != NULL){cout<< tree->data <<'t'; //先访问根节点preOrder(tree->left); //再遍历左子树 preOrder(tree->right); //最后遍历右子树 }}//中序遍历void inOrder(TreeNode *tree){if(tree != NULL){inOrder(tree->left); //先遍历左子树 cout<< tree->data <<'t'; //再访问根节点inOrder(tree->right); //最后遍历右子树 }}//后序遍历void postOrder(TreeNode *tree){if(tree != NULL){postOrder(tree->left); //先遍历左子树 postOrder(tree->right); //再遍历右子树 cout<< tree->data <<'t'; //最后访问根节点 }}//查找最大值TreeNode* findMax(TreeNode *tree){if(tree == NULL)return NULL;else if(tree->right == NULL)return tree;elsereturn findMax(tree->right);}//查找最小值TreeNode* findMin(TreeNode *tree){if(tree == NULL)return NULL;else if(tree->left == NULL)return tree;elsereturn findMin(tree->left);}//删除节点void remove(TreeNode *&tree, int val){if(tree == NULL)return;else if(val < tree->data)remove(tree->left, val);else if(val > tree->data)remove(tree->right, val);else//找到要删除的节点{if(tree->left != NULL && tree->right != NULL)//左右子树均不为空{TreeNode *temp = tree;TreeNode *max = findMax(tree->left);//查找左子树的最大结点tree->data = max->data;//将最大结点的值替换到要删除的节点remove(temp->left, max->data);//将最大结点删掉}else//只有一边的子节点不为空或者左右节点都为空{TreeNode *temp = tree;if(tree->left == NULL)//如果左节点为空,就将右节点提升 tree = tree->right;else if(tree->right == NULL)//如果右节点为空,就将左节点提升tree = tree->left;delete temp;//删掉要删除的节点}}}int main(){TreeNode *tree = NULL; //声明一个空树int arr[10] = {12, 3, 4, 6, 7, 9, 10, 5, 2, 8};for(int i=0; i<10; i++){insert(tree, arr[i]);//把数组元素插入到树当中}cout<<'先序遍历:';preOrder(tree);cout<<endl;cout<<'中序遍历:';inOrder(tree);cout<<endl;cout<<'后序遍历:';postOrder(tree);cout<<endl;cout<<'查找节点数据:4';TreeNode *findNode = find(tree, 4);if(findNode != NULL)//如果节点存在cout<<'找到了,节点的值是:'<<findNode->data;else//如果节点不存在cout<<'没有找到';cout<<endl;cout<<'查找树的最大值:'<<findMax(tree)->data<<endl; cout<<'查找树的最小值:'<<findMin(tree)->data<<endl; cout<<'删除节点:。

说明---数据结构C语言版 参考代码

说明---数据结构C语言版 参考代码
主函数即对函数的各种操作在list.c中;
各种自定义函数在mylist.h文件中;
test.c是对一些不熟悉的调用进行的测试;
//函数的说明不尽详细,请参照《数据结构(C语言)》版课本;作者为严蔚敏的。
//注意函数调用中的参数----大多是传递的地址,只有赋值的部分用的是传值!!!!
1、线性结构及其操作:
线性表的顺序、链式存储(结构体)以及基本的新建、初始化、插入、删除操作
循环链表、双向链表的实现以及基本(插入、删除)操作
2、树和图的几个图的建立与深度优先递归遍历。。。
暂时不再写了,等过段时间,如果有兴趣可以继续拿着 数据结构(C语言版)课本实现~

数据结构与算法实验源代码

数据结构与算法实验源代码

数据结构与算法实验源代码数据结构与算法实验源代码一、实验目的本实验旨在通过编写数据结构与算法的实验源代码,加深对数据结构与算法的理解,并提高编程能力。

二、实验环境本实验使用以下环境进行开发和测试:- 操作系统:Windows 10- 开发工具:IDEA(集成开发环境)- 编程语言:Java三、实验内容本实验包括以下章节:3.1 链表在本章节中,我们将实现链表数据结构,并实现基本的链表操作,包括插入节点、删除节点、查找节点等。

3.2 栈和队列在本章节中,我们将实现栈和队列数据结构,并实现栈和队列的基本操作,包括入栈、出栈、入队、出队等。

3.3 树在本章节中,我们将实现二叉树数据结构,并实现二叉树的基本操作,包括遍历树、搜索节点等。

3.4 图在本章节中,我们将实现图数据结构,并实现图的基本操作,包括广度优先搜索、深度优先搜索等。

3.5 排序算法在本章节中,我们将实现各种排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。

3.6 搜索算法在本章节中,我们将实现各种搜索算法,包括线性搜索、二分搜索、广度优先搜索、深度优先搜索等。

四、附件本文档附带实验源代码,包括实现数据结构和算法的Java源文件。

五、法律名词及注释5.1 数据结构(Data Structure):是指数据对象中数据元素之间的关系。

包括线性结构、树形结构、图形结构等。

5.2 算法(Algorithm):是指解决问题的一系列步骤或操作。

算法应满足正确性、可读性、健壮性、高效性等特点。

5.3 链表(Linked List):是一种常见的数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

5.4 栈(Stack):是一种遵循后进先出(LIFO)原则的有序集合,用于存储和获取数据。

5.5 队列(Queue):是一种遵循先进先出(FIFO)原则的有序集合,用于存储和获取数据。

5.6 树(Tree):是由节点组成的层级结构,其中一种节点作为根节点,其他节点按照父子关系连接。

数据结构源代码(全)

数据结构源代码(全)

/*顺序表的操作#include<iostream>#include<stdlib.h>using namespace std; Release 13.12 rev 9501 (2013/12/25 19:25:45) gcc 4.7.1 Windows/unicode - 32 bit#define MAX_SIZE 100 typedef struct{int *emel;int lenth;}Sq;void init(Sq &l);void create(Sq &l);void trval(Sq &l);void find_value(Sq &l); void find_position(Sq &l); void insert(Sq &l);void dele(Sq &l);int main(){S q l;i nit(l);c reate(l);t rval(l);f ind_value(l);f ind_position(l);i nsert(l);t rval(l);d ele(l);t rval(l);r eturn 0;}void init(Sq &l){l.emel =new int[MAX_SIZE];i f(l.emel ==NULL){c out<<"\t申请空间失败!"<<endl;e xit(1);}l.lenth=0;cout<<"\t成功申请空间!该顺序表的长度目前为:"<<l.lenth<<endl;}void create(Sq &l){c out<<"\t请输入你想输入元素的个数:";i nt x;c in>>x;if((x<1)&&(x>MAX_SIZE)){c out<<"\t你说输入的数不在范围里"<<endl;r eturn;}int i;for(i=0;i<x;i++){c in>>l.emel[i];}l.lenth=x;cout<<"\t成功赋值!"<<endl;}void trval(Sq &l){i nt i;c out<<"l(";f or(i=0;i<l.lenth;i++){cout<<l.emel[i]<<" "; }c out<<")"<<" 该顺序表现在的长度为:"<<l.lenth<<endl;}void find_value(Sq &l) {i nt x,t=0;c out<<"\t请输入你要查找的值:";c in>>x;i nt i;f or(i=0;i<l.lenth;i++){if(l.emel[i]==x){t=1;c out<<"\t成功找到该元素,它是顺序表的第"<<i+1<<"个元素!"<<endl;}}i f(t==0){cout<<"\t无该元素!"<<endl;}}void find_position(Sq &l) {i nt x;c out<<"\t请输入你要查找的位置:";c in>>x;i nt i;i f((x<1)||(x>l.lenth)){cout<<"\t输入的值不在范围内!"<<endl;return;}f or(i=1;i<=l.lenth;i++){if(i==x){c out<<"\t成功找到该元素,该值是"<<l.emel[i-1]<<endl;}}}void insert(Sq &l){int i,x,y;cout<<"\t请输入你要插入的位置";cin>>x;cout<<"\t请输入你要插入的值";cin>>y;if((x<1)||(x>l.lenth)) {cout<<"\t输入的值不在范围内!"<<endl;return;}if(x==l.lenth){l.emel[l.lenth]=y;l.lenth=l.lenth+1;return;}for(i=l.lenth;i>=x;i--) {l.emel[i]=l.emel[i-1]; }l.emel[x-1]=y;l.lenth=l.lenth+1;}void dele(Sq &l){int i,x;cout<<"\t请输入你要删除位置:";cin>>x;if((x<1)||(x>l.lenth))cout<<"\t输入的值不在范围内!"<<endl;return;}for(i=x-1;i<=l.lenth;i++) {l.emel[i]=l.emel[i+1];l.lenth=l.lenth-1;}成功申请空间!该顺序表的长度目前为:0请输入你想输入元素的个数:385成功赋值!l(8 5 2 ) 该顺序表现在的长度为:3请输入你要查找的值:5成功找到该元素,它是顺序表的第2个元素!请输入你要查找的位置:3成功找到该元素,该值是2请输入你要插入的位置3请输入你要插入的值10l(8 5 2 10 ) 该顺序表现在的长度为:4请输入你要删除位置:3l(8 5 10 ) 该顺序表现在的长度为:3--------------------------------Process exited with return value 0Press any key tocontinue . . .*//*#include<stdio.h> #include<stdlib.h> typedef struct Link {int num;struct Link *next;}L;L* creat(L* head){head=(L*)malloc(sizeof(L));if(head==NULL){printf("头节点申请失败!\n");exit(-1);}head->next=NULL; return head;}void insert(L* head) {int x,i;printf("请输入你想输入数据的个数:");scanf("%d",&x);L *p,*q;p=head;for(i=0;i<x;i++){q=(L *)malloc(sizeof(L));if(q==NULL){printf("新点申请失败!\n");exit(-1);}printf("请输入值:"); scanf("%d",&q->num);q->next=NULL; p->next=q;p=q;}}void print(L* head) {L *p;p=head->next;while(p!=NULL){printf("值为:%d\n",p->num);p=p->next;}}int main(){L *head;head=creat(head);printf("成功创建头节点!!!\n");insert(head);printf("成功输入数据!!!\n");print(head); return 0;}*//*线性表的操作#include<stdio.h> #include<stdlib.h> typedef struct Link{int num;struct Link *next; }L;L* creat(L* head) {head=(L*)malloc(sizeof(L));if(head==NULL){printf("头节点申请失败!\n");exit(-1);}head->next=NULL; return head;}void init(L* head){int x,i;printf("请输入你想输入数据的个数:");scanf("%d",&x);L *p,*q;p=head;for(i=0;i<x;i++){q=(L *)malloc(sizeof(L)); if(q==NULL){printf("新点申请失败!\n");exit(-1);}printf("请输入值:"); scanf("%d",&q->num); q->next=p->next;p->next=q;}}int print(L* head) {L *p;int lenth=0;p=head->next; printf("\t\tL("); while(p!=NULL) {lenth++;printf("%d ",p->num); p=p->next;}printf(")\n");return lenth;}int insert(L *head,int lenth){printf("\t\t请输入你要插入的元素的位置:");int in;scanf("%d",&in);if(in<1 || in>lenth){printf("\t\t输入值不在范围内!");}L *p,*q;p=head->next;q=(L *)malloc(sizeof(L)); if(q==NULL){printf("新点申请失败!\n");}printf("\t\t请为新节点输入值:");scanf("%d",&q->num); int i=0;while(p!=NULL){i++;if(i==in-1){q->next=p->next; p->next=q;}p=p->next;}lenth++;return lenth;}int dele(L *head,int lenth) {printf("\t\t请输入你要删除的元素的位置:");int out;scanf("%d",&out);if(out<1 || out>lenth) {printf("\t\t输入值不在范围内!");return -1;}L *p,*q;p=head->next; q=head;int i=0;while(p!=NULL) {i++;if(i==out) {q->next=p->next; }q=p;p=p->next;}lenth--;return lenth;}void find(L *head,int lenth) {printf("\t\t请输入你要查找的元素的位置:");int finder;scanf("%d",&finder);if(finder<1 || finder>lenth){。

基础数据结构代码

基础数据结构代码
else
cout<<"\n 已找到,元素位置是 "<<loc;
}
break;
} /* switch */
}while(k!=6);
cout<<"\n 再见!";
cout<<"\n 打回车键,返回。";
int i;
cout<<"\n n=?";
cin>>L->length;
for(i=0;i<L->length;i++)
{
cout<<"\n data "<<i<<"=?";
cin>>L->data[i];
}
}
//遍历顺序表
void out_list(SqList L){
out_list(a);
}
break;
case 3:{
cout<<"\n i=?";
cin>>i;
ListDelete_Sq( &a, i, e);
out_list(a);
cout<<"\n e="<<e;
i--; /*将顺序表逻辑位序转化为data下标即物理位序*/
e=L->data[i];
for (j=i;j<L->length-1;j++) L->data[j]=L-> data[j+1];

【数据结构】线性表顺序表详解和代码实例

【数据结构】线性表顺序表详解和代码实例

【数据结构】线性表顺序表详解和代码实例线性表(List)是零个或者多个数据元素的有限序列.⾸先它是⼀个序列.⾥⾯的元素是有顺序的,如果有多个元素,除开头和结尾以外的元素都有⼀个前驱和⼀个后继.⽽开头元素只有后继,结尾元素只有前驱.其次线性表是有限的,也就是⾥⾯的元素个数是有限的。

1ADT 线性表(List)2Data3线性表的数据对象集合为{a1, a2, a3, ......, an},每个元素类型为DataType。

4Operation5InitList(L); //初始化线性表6 IsEmptyList(L); //判断线性表是否为空7 ClearList(L); //清空线性表8 GetElemList(L, i, *e); //获取第i个位置的数据9 SearchList(L, e); //查找与数据e相等的元素10 InsertNodeList(L, i, e);//在第i个位置插⼊元素11 DeleteNodeList(L, i, *e);//删除第i个位置的元素,e获取删除元素12 GetLengthList(L); //获取线性表的长度13endADT关于线性表的基本操作就上⾯⼏种,还有⼏个例如线性表的排序,合并,逆序等等操作。

为了⽂章篇幅,就下次再介绍了。

线性表的顺序存储结构,就是指 ⽤⼀段地址连续的存储单元⼀次存储线性表的数据元素。

学过⾼级语⾔的朋友,相信对数组这玩意⼉都不会陌⽣吧。

数组就是⼀种顺序存储结构。

链式存储结构就是可以⽤⼀组任意的内存单元存储线性表中的元素。

与顺序存储不同的是,这组内存单元可以是连续的,也可以是不连续的。

这就意味着,元素可以存储在内存的任意位置。

正因为如此,在链式结构中,每个元素不仅要存它的信息,还需要存储它后继元素的存储地址。

我们把存储元素信息的域称为数据域,⽽把存储后继元素地址的域称为指针域。

由这两部分共同组成的数据元素ai,则可以称之为节点(Node)。

数据结构c++顺序表、单链表的基本操作,查找、排序代码

数据结构c++顺序表、单链表的基本操作,查找、排序代码

} return 0; }
实验三 查找
实验名称: 实验3 查找 实验目的:掌握顺序表和有序表的查找方法及算法实现;掌握二叉排序 树和哈希表的构造和查找方法。通过上机操作,理解如何科学地组织信 息存储,并选择高效的查找算法。 实验内容:(2选1)内容1: 基本查找算法;内容2: 哈希表设计。 实验要求:1)在C++系统中编程实现;2)选择合适的数据结构实现查 找算法;3)写出算法设计的基本原理或画出流程图;4)算法实现代码 简洁明了;关键语句要有注释;5)给出调试和测试结果;6)完成实验 报告。 实验步骤: (1)算法设计 a.构造哈希函数的方法很多,常用的有(1)直接定址法(2)数字分析法;(3) 平方取中法;(4)折叠法;( 5)除留余数法;(6)随机数法;本实验采用的是除 留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈 希地址 (2)算法实现 hash hashlist[n]; void listname(){ char *f; int s0,r,i; NameList[0].py="baojie"; NameList[1].py="chengቤተ መጻሕፍቲ ባይዱoyang"; ……………………………… NameList[29].py="wurenke"; for(i=0;i<q;i++){s0=0;f=NameList[i].py; for(r=0;*(f+r)!='\0';r++) s0+=*(f+r);NameList[i].k=s0; }} void creathash(){int i;
v[k-1]=v[k]; nn=nn-1; return ; } int main() {sq_LList<double>s1(100); cout<<"第一次输出顺序表对象s1:"<<endl; s1.prt_sq_LList(); s1.ins_sq_LList(0,1.5); s1.ins_sq_LList(1,2.5); s1.ins_sq_LList(4,3.5); cout<<"第二次输出顺序表对象s1:"<<endl; s1.prt_sq_LList(); s1.del_sq_LList(0); s1.del_sq_LList(2); cout<<"第三次输出顺序表对象s1:"<<endl; s1.prt_sq_LList(); return 0; } 运行及结果:

数据结构实验报告-实验一顺序表、单链表基本操作的实现

数据结构实验报告-实验一顺序表、单链表基本操作的实现

数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。

(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。

(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。

l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。

数据结构 串基本操作代码

数据结构 串基本操作代码

数据结构串基本操作代码简介本文档介绍了数据结构中串的基本操作代码,包括串的定义、串的赋值、串的比较、串的连接、串的替换等。

1.串的定义串是由零个或多个字符组成的有限序列,是字符串的抽象数据类型。

常用的串类型包括顺序串和链式串。

1.1 顺序串顺序串是使用数组来存储字符序列的数据结构。

其定义如下:```cdefine MaXSiZe 100 // 串的最大长度typedef struct {char data[MaXSiZe]; // 存储串的字符数组int length; // 串的长度} SqString;```1.2 链式串链式串是使用链表来存储字符序列的数据结构。

其定义如下:```ctypedef struct LNode {char data; // 存储串的字符struct LNode next; // 指向下一个节点的指针} LNode, LinkString;```2.串的基本操作2.1 串的赋值将一个字符串赋值给一个串,可以使用字符串赋值函数`strcpy`或者循环遍历字符串赋值。

2.1.1 使用strcpy函数赋值```cinclude <string.h>void Strassign(SqString s, char str) {strcpy(s->data, str);s->length = strlen(str);}```2.1.2 使用循环遍历赋值```cvoid Strassign(SqString s, char str) {int i;for (i = 0; str[i] != '\\0'; i++) {s->data[i] = str[i];}s->length = i;s->data[i] = '\\0';}```2.2 串的比较比较两个串是否相等,可以使用字符串比较函数`strcmp`或者循环遍历比较。

单链表的基本操作代码

单链表的基本操作代码

单链表的基本操作代码单链表是一种常用的数据结构,它具有优秀的插入和删除性能,在数据存储和处理方面具有广泛的应用。

单链表的基本操作包含创建链表、插入节点、删除节点、查找节点等,下面是单链表的基本操作代码:1. 定义单链表结构体:typedef struct ListNode {int val;struct ListNode *next;} ListNode;2. 创建单链表:ListNode *createList(int arr[], int n) {ListNode *head = NULL, *tail = NULL, *p = NULL;for(int i = 0; i < n; i++) {p = (ListNode *)malloc(sizeof(ListNode));p->val = arr[i];p->next = NULL;if(head == NULL) {head = tail = p;} else {tail->next = p;tail = p;}}return head;}3. 插入节点:void insertNode(ListNode **head, int val, int pos) {ListNode *p = (ListNode *)malloc(sizeof(ListNode)); p->val = val;p->next = NULL;if(*head == NULL) {if(pos != 0) {printf("Invalid position\n");return;} else {*head = p;return;}}if(pos == 0) {p->next = *head;*head = p;} else {int i = 0;ListNode *q = *head;while(q != NULL && i < pos - 1) {q = q->next;i++;}if(q == NULL || i != pos - 1) {printf("Invalid position\n");return;}p->next = q->next;q->next = p;}}4. 删除节点:void deleteNode(ListNode **head, int pos) {if(*head == NULL) {printf("List is empty\n");return;}if(pos == 0) {ListNode *p = *head;*head = (*head)->next;free(p);} else {int i = 0;ListNode *p = *head, *q = NULL; while(p != NULL && i < pos) { q = p;p = p->next;i++;}if(p == NULL || i != pos) {printf("Invalid position\n");return;}q->next = p->next;free(p);}}5. 查找节点:ListNode *findNode(ListNode *head, int val) {ListNode *p = head;while(p != NULL) {if(p->val == val) {return p;}p = p->next;}return NULL;}单链表的基本操作是数据结构中最基础的部分,掌握好这些代码对于往后的学习和应用都会有很大的帮助。

数据结构串基本操作代码

数据结构串基本操作代码

数据结构串基本操作代码串是由零个或多个字符组成的有限序列,是数据结构中的一种基本数据类型。

常见的串操作有串的存储、串的插入、串的删除、串的替换、串的连接、串的比较等。

以下是对串基本操作的代码实现:1.串的存储串的存储可以使用数组或链表来实现。

下面是基于数组的实现方式。

```C++#define MAX_LEN 100 // 定义串的最大长度typedef structchar data[MAX_LEN]; // 存储串的字符数组int length; // 当前串的长度} String;//初始化串void InitString(String &s)s.length = 0;//串赋值void AssignString(String &s, char str[])int len = strlen(str);for (int i = 0; i < len; i++)s.data[i] = str[i];}s.length = len;//输出串void PrintString(String s)for (int i = 0; i < s.length; i++)cout << s.data[i];}cout << endl;```2.串的插入在指定位置上插入指定内容。

```C++//串的插入void InsertString(String &s, int pos, char str[]) int len = strlen(str);if (s.length + len > MAX_LEN)return; // 串已满,无法插入for (int i = s.length - 1; i >= pos; i--)s.data[i + len] = s.data[i];}for (int i = pos, j = 0; j < len; i++, j++)s.data[i] = str[j];}s.length += len;```3.串的删除删除指定位置上的字符。

数据结构实验内容及代码

数据结构实验内容及代码

数据结构实验内容及代码实验内容和目的:掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。

学习基本的查找和排序技术。

让我们在实际上机中具有编制相当规模的程序的能力。

养成一种良好的程序设计风格。

实验教材:数据结构题集(C语言版)清华大学出版社2007年实验项目:实验一、栈和循环队列㈠、实验内容:①栈掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。

本程序采用的是链栈结构,具有初始化一个栈、PUSH、POP、显示所有栈里的元素四个功能。

②循环队列掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。

本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。

㈡、实验代码①栈程序代码:#include <stdio.h>#include <malloc.h>#define Stack_Size 6#define ERROR 0#define OK 1typedef int SElemType;typedef struct SNode{SElemType data;struct SNode *next;}SNode,*LinkStack;int CreatTwo(LinkStack &head,int n){int i;SNode *p;head=(LinkStack)malloc(sizeof(SNode));head->next=NULL;printf("请输入数据(数字):\n");for(i=n;i>0;--i){p=(SNode *)malloc(sizeof(SNode));scanf("%d",&p->data);p->next=head->next;head->next=p;}return 1;}int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}int Push(LinkStack &top,SElemType e){SNode *q;q=(LinkStack)malloc(sizeof(SNode));if(!q){printf("溢出!\n");return(ERROR);}q->data=e;q->next=top->next;top->next=q;return(OK);}int Pop(LinkStack &top,SElemType &e){SNode *q;if(!top->next){printf("error!\n");return(ERROR);}e=top->next->data;q=top->next;top->next=q->next;free(q);return(OK);}void main(){ int e;LinkStack top;printf("1.初始化一个栈;\n2.PUSH;\n3.POP;\n4.显示所有栈里的元素;\n5.结束;\n");while(1){switch(menu_select()){case 1:if(CreatTwo(top,Stack_Size))printf("Success!\n");break; case 2:printf("Push:\n");scanf("%d",&e);if(Push(top,e))printf("Success!\n");break;case 3:if(Pop(top,e))printf("Success!\n");printf("%d\n",e);break;case 4:LinkStack p;printf("所有栈里的元素:\n");p=top;while(p->next){p=p->next;printf("%7d",p->data);}printf("\n");break;case 5:return;}}}运行结果:②循环队列程序代码:#include<stdlib.h>#include<stdio.h>#define OVERFLOW -1#define OK 1#define ERROR 0#define MAXSIZE 100typedef struct{int *elem;//队列存储空间int front;int rear;}SqQueue;//判断选择是否正确int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}//参数(传出)SqQueue &Q,循环队列(空)int InitQueue(SqQueue &Q){Q.elem=(int *)malloc(MAXSIZE*sizeof(int));if(!Q.elem)exit(OVERFLOW);Q.front=Q.rear=-1;for(int i=0;i<MAXSIZE;i++)Q.elem[i]=-1;return OK;}//返回Q的元素个数int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}//显示队列的元素void Display(SqQueue Q){for(int i=0;i<=QueueLength(Q);i++)if(Q.elem[i]!=-1)printf("%d ",Q.elem[i]);printf("\n");}//入队int EnQueue(SqQueue &Q,int e){Q.rear=(Q.rear+1)%MAXSIZE;if(Q.rear==Q.front)return ERROR;Q.elem[Q.rear]=e;return OK;}//出队int DeQueue(SqQueue &Q,int &e){if(Q.front==Q.rear)return ERROR;e=Q.elem[Q.front+1];Q.elem[Q.front+1]=-1;Q.front=(Q.front+1)%MAXSIZE;return OK;}void main(){SqQueue Q;InitQueue(Q);int elem,e;printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);printf("1.初始化一个队列;\n2.入队;\n3.出队;\n4.显示队列的所有元素;\n5.队列长度:\n6.结束;\n");while(1){switch(menu_select()){case 1:printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);fflush(stdin);break;case 2:scanf("%d",&elem);EnQueue(Q,elem);printf("队列为:\n");Display(Q);fflush(stdin);break;case 3:DeQueue(Q,elem);printf("队列为:\n");Display(Q);break;case 4:printf("\n队列的所有元素:\n");Display(Q);break;case 5:printf("%d\n",QueueLength(Q));break;case 6:return;}}}运行结果:实验二、数组㈠、实验内容:数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。

《数据结构》实验书

《数据结构》实验书

目录实验一线性表基本操作的编程实现 (201)实验二堆栈或队列基本操作的编程实现 (49)实验四二维数组基本操作的编程实现 (18)实验五二叉树基操作的编程实现 (20)实验六图基本操作的编程实现 (45)(特别提示:程序设计包含两个方面的错误。

其一是错误,其二是能错误。

为了提高学生的编程和能力,本指导书给出的程序代码并的两种错误。

并且也不保证程序的完整性,有一些语句已经故意删除,就是要求学生自己编制完成,这样才能达到我们的要求。

希望大家以自己所学高级语言的基本功和点为基础,不要过于依赖给出的参考代码,这样才能有所进步。

如果学生能够根据要求完全自己编制,那就不好了。

)实验一线性表基本操作的编程实现【实验目的】线性表基本操作的编程实现要求:线性表基本操作的编程实现(2学时,验证型),掌握线性表的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、逆序、排序等操作,存储结构可以在顺序结构或链表结分主要功能,也可以用菜单进行管理完成大部分功能。

还鼓励学生利用基本操作进行一些更实际的应用型程序设计。

【实验性质】【实验内容】把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。

建议实现键盘输入数据以实现程序的通据的函数。

【注意事项】【思考问题】1.线性表的顺序存储和链表存储的差异?优缺点分析?2.那些操作引发了数据的移动?3.算法的时间效率是如何体现的?4.链表的指针是如何后移的?如何加强程序的健壮性?【参考代码】(一)利用顺序表完成一个班级学生课程成绩的简单管理1、预定义以及顺序表结构类型的定义(1)#define ListSize //根据需要自己设定一个班级能够容纳的最大学生数(2)typedef struct Stu{int num; //学生的学号char name[10]; //学生的姓名float wuli; //物理成绩float shuxue; //数学成绩float yingyu; //英语成绩}STUDENT; //存放单个学生信息的结构体类型typedef struct List{stu[ListSize]; //存放学生的数组定义,静态分配空间int length; //记录班级实际学生个数}LIST; //存放班级学生信息的顺序表类型2、建立班级的学生信息void listcreate(LIST *Li,int m) //m为该班级的实际人数{int i;Li->length=0;for(i=0;i<m;i++) //输入m个学生的所有信息{printf("please input the %dth student's information:\n",i+1);printf("num=");scanf("%d", ); //输入第i个学生的学号printf("name=");scanf("%s", ); //输入第i个学生的姓名printf("wuli=");scanf("%f", ); //输入第i个学生的物理成绩printf("shuxue=");scanf("%f", ); //输入第i个学生的数学成绩printf("yingyu=");scanf("%f", ); //输入第i个学生的英语成绩Li->length++; //学生人数加1}}3、插入一个学生信息int listinsert(LIST *Li,int i) //将学生插入到班级Li的第i个位置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五图//图的邻接矩阵存储#include "stdio.h"#include "stdlib.h"typedef struct{int adj;}AdjMatrix[10][10];typedef struct{int vexs[10];AdjMatrix arcs;int vexnum,arcnum;}MGraph;int LocateVex(MGraph &G,int v){int k,j=0;for(k=0;k<G.vexnum;k++)if(G.vexs[k]==v){j=k;break;}return j;}void Create(MGraph &G){int i,j,k;int v1=0,v2=0,w=0;printf("请输入图的顶点数:");scanf("%d",&G.vexnum);printf("请输入图的边数:");scanf("%d",&G.arcnum);//printf("请输入图的顶点:");for(i=0;i<G.vexnum;i++)G.vexs[i]=i+1;for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j].adj=0;for(k=0;k<G.arcnum;k++){printf("请输入一条边依附的顶点v1,v2及权值(v1,v2,w):"); scanf("%d,%d,%d",&v1,&v2,&w);i=LocateVex(G,v1);j=LocateVex(G,v2);G.arcs[i][j].adj=w;//G.arcs[j][i].adj=G.arcs[i][j].adj;}}void display(MGraph &G){int i,j;for(i=0;i<G.vexnum;i++){for(j=0;j<G.vexnum;j++)printf("%d ",G.arcs[i][j].adj); printf("\n");}}void main(){MGraph G;Create(G);display(G);}//图的邻接表存储及深度广度遍历#include "stdio.h"#include "stdlib.h"typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;int weight;}ArcNode;typedef struct VNode{char vertex; //顶点域ArcNode *firstarc;}VNode,AdjList[10];typedef struct{AdjList adjlist;int vexnum,arcnum;}ALGraph;int LocateVex(ALGraph &G,char v){int k,j=0;for(k=0;k<G.vexnum;k++)if(G.adjlist[k].vertex==v){j=k;break;}return j;}void CreateALGraph(ALGraph &G){//建立无向图的邻接表表示int i,j,k,w;char v1,v2;ArcNode *s;printf("请输入顶点数和边数(vexnum,arcnum):");scanf( "%d,%d",&G.vexnum,&G.arcnum); //读人顶点数和边数for(i=0;i<G.vexnum;i++){//建立顶点表getchar();printf("请输入第%d顶点信息:",i+1);scanf("%c",&G.adjlist[i].vertex); //读入顶点信息G.adjlist[i].firstarc=NULL;//边表置为空表}for(k=0;k<G.arcnum;k++){//建立边表getchar();printf("请输入第%d边的顶点对序号和边的权值(v1,v2,w):",k+1);scanf("%c,%c,%d",&v1,&v2,&w);//读入边(vi,vj)的顶点对序号j=LocateVex(G,v2);i=LocateVex(G,v1);s=(ArcNode *)malloc(sizeof(ArcNode)); //生成边表结点s->adjvex=j; //邻接点序号为js->weight=w;s->nextarc=G.adjlist[i].firstarc;G.adjlist[i].firstarc=s; //将新结点*s插入顶点vi的边表头部//若图为无向图则加上下面的四句代码,若图为有向图则注释下面的四句代码s=(ArcNode *)malloc(sizeof(ArcNode));s->adjvex=i; //邻接点序号为is->weight=w;s->nextarc=G.adjlist[j].firstarc;G.adjlist[j].firstarc=s; //将新结点*s插入顶点vj的边表头部}//end for}bool visited[20];int v;void DFS(ALGraph &G,int v){visited[v]=true;printf("%c ",G.adjlist[v].vertex);ArcNode *w;for(w=G.adjlist[v].firstarc;w!=NULL;w=w->nextarc)if(!visited[w->adjvex])DFS(G,w->adjvex);}void DFSTraverse(ALGraph &G) //图的深度遍历操作{for(v=0;v<G.vexnum;v++)visited[v]=false;for(v=0;v<G.vexnum;v++)if(!visited[v])DFS(G,v);}//队列typedef struct QNode {int data;struct QNode *next;}QNode,*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;void InitQueue(LinkQueue &Q) //构造一个空队列Q {Q.rear=Q.front=(QueuePtr)malloc(sizeof(QNode));Q.front->next=NULL;}void EnQueue(LinkQueue &Q,int e) //进队列{QNode *p;p=(QueuePtr)malloc(sizeof(QNode));p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;}void DeQueue(LinkQueue &Q,int &e2) //出队列{QNode *p;p=Q.front->next;e2=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);}bool visited1[20];void BFSTraverse(ALGraph &G){for(v=0;v<G.vexnum;v++)visited1[v]=false;LinkQueue Q;InitQueue(Q);for(v=0;v<G.vexnum;v++)if(!visited1[v]){visited1[v]=true;printf("%c ",G.adjlist[v].vertex);EnQueue(Q,v);int u;ArcNode *w;while(Q.front!=Q.rear){DeQueue(Q,u);for(w=G.adjlist[u].firstarc;w!=NULL;w=w->nextarc)if(!visited1[w->adjvex]){visited1[w->adjvex]=true;printf("%c ",G.adjlist[w->adjvex].vertex);EnQueue(Q,w->adjvex);}//if}//while}//if}//BFSTraversevoid display(ALGraph &G)//输出图的顶点信息{printf("建立的邻接表位:\n");int i;for(i=0;i<G.vexnum;i++){if(G.adjlist[i].firstarc!=NULL){printf("%c->",G.adjlist[i].vertex);ArcNode *p;p=G.adjlist[i].firstarc;while(p!=NULL){printf("%d->",p->adjvex);p=p->nextarc;}printf("NULL\n");}else{printf("%c->NULL\n",G.adjlist[i].vertex);}}}void main(){ALGraph G;CreateALGraph(G);display(G);/*printf("\n\n");printf("图的深度遍历为:\n");DFSTraverse(G);printf("\n");printf("\n\n");printf("图的广度遍历为:");BFSTraverse(G);printf("\n");*/}。

相关文档
最新文档