日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构课程设计(C语言实现)

發(fā)布時(shí)間:2024/1/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构课程设计(C语言实现) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

僅供自己學(xué)習(xí)使用


一、設(shè)計(jì)任務(wù)

??設(shè)計(jì)一個(gè)應(yīng)用程序(C/C++),利用多級(jí)菜單實(shí)現(xiàn)單鏈表、棧、隊(duì)列、二叉樹及圖五種結(jié)構(gòu)的基本操作及應(yīng)用。具體內(nèi)容包括:

  • 單鏈表的基本操作及應(yīng)用
    ①創(chuàng)建
    ②插入
    ③刪除
    ④查找
    ⑤應(yīng)用
    注:利用基本操作(可擴(kuò)展)實(shí)現(xiàn)單鏈表的應(yīng)用,如一元多項(xiàng)式運(yùn)算、通訊錄設(shè)計(jì)等。
  • 棧的基本操作及應(yīng)用
    ①進(jìn)棧
    ②出棧
    ③取棧頂元素
    ④應(yīng)用
    注:利用基本操作(可擴(kuò)展)實(shí)現(xiàn)棧的應(yīng)用,如表達(dá)式求值、深度優(yōu)先遍歷等。
  • 隊(duì)列的基本操作及應(yīng)用
    ①入列
    ②出列
    ③取隊(duì)頭元素
    ④取隊(duì)尾元素
    ⑤應(yīng)用
    注:利用基本操作(可擴(kuò)展)實(shí)現(xiàn)隊(duì)列的應(yīng)用,如酒店客房分配、廣度優(yōu)先遍歷等。
  • 二叉樹的基本操作及應(yīng)用
    ①創(chuàng)建
    ②遍歷(先序、中序、后序)
    ③求結(jié)點(diǎn)個(gè)數(shù)
    ④求樹的深度
    ⑤查找雙親
    ⑥查找兄弟(左/右)
    ⑦查找孩子(左/右)
    ⑧應(yīng)用
    注:利用基本操作(可擴(kuò)展)實(shí)現(xiàn)二叉樹的應(yīng)用,如二叉排序樹、Huffman編碼等。
  • 圖的基本操作及應(yīng)用
    ①創(chuàng)建(鄰接矩陣/鄰接表)
    ②遍歷(深度/廣度)
    ③定位
    ④找第一個(gè)鄰接點(diǎn)
    ⑤找下一個(gè)鄰接點(diǎn)
    ⑥插入(點(diǎn)/邊)
    ⑦刪除(點(diǎn)/邊)
    ⑧應(yīng)用
    注:利用圖的基本操作(可擴(kuò)展)實(shí)現(xiàn)圖的應(yīng)用,如拓?fù)渑判颉㈥P(guān)鍵路徑等。
  • 二、運(yùn)行效果圖

    三、部分源代碼

    1. bitree.h

    #include<stdio.h> #include<stdlib.h> #include"user.h"//二叉樹結(jié)構(gòu)體 typedef struct BiTNode {char data;struct BiTNode* lchild, * rchild; } BiTNode, * BiTree;//初始化 Status InitBiTree(BiTree& T) {T = (BiTree)malloc(sizeof(BiTNode));if (!T) {printf("內(nèi)存分配失敗。\a\n\n");}T->lchild = T->rchild = NULL;return OK; }//先序創(chuàng)建 void CreateBiTree(BiTree& T) {char ch;printf("請輸入結(jié)點(diǎn)數(shù)據(jù)(先序):");scanf_s("%c", &ch);getchar();if (ch == '*')T = NULL;else {T = new BiTNode;T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);} } //先序遍歷 void PreOrderTraverse1(BiTree T) {if (T) {printf("%c", T->data);PreOrderTraverse1(T->lchild);PreOrderTraverse1(T->rchild);} } //中序遍歷 void InOrderTraverse2(BiTree T) {if (T) {InOrderTraverse2(T->lchild);printf("%c", T->data);InOrderTraverse2(T->rchild);} } //后序遍歷 void PostOrderTraverse3(BiTree T) {if (T) {PostOrderTraverse3(T->lchild);PostOrderTraverse3(T->rchild);printf("%c", T->data);} } //二叉樹深度 int Depth(BiTree T) {int n, m;if (T == NULL)return 0;else {m = Depth(T->lchild);n = Depth(T->rchild);if (m > n)return(m + 1);elsereturn(n + 1);} } //葉子結(jié)點(diǎn)個(gè)數(shù) int LeafCount(BiTree T) {if (T == NULL){return 0;}if ((T->lchild == NULL) && (T->rchild == NULL)){return 1;}return LeafCount(T->lchild) + LeafCount(T->rchild); } //查找雙親 Status Parent(BiTree T, char e)// 初始條件:二叉樹T存在,e是T中某個(gè)結(jié)點(diǎn) // 操作結(jié)果:若e是T的非根結(jié)點(diǎn),則返回它的雙親;否則返回“空” {Status m;if (T == NULL) // 空樹return 0;if ((T->lchild && T->lchild->data == e) || (T->rchild && T->rchild->data == e)) {printf("結(jié)點(diǎn)的雙親數(shù)據(jù)是:%c\n\n",T->data);return OK;}m = Parent(T->lchild, e);if (m == 0) m = Parent(T->rchild, e);return m; } //查找兄弟 Status Brother(BiTree T, char e) {Status m;if (T == NULL) // 空樹return 0;if (T->lchild && T->lchild->data == e) {printf("結(jié)點(diǎn)存在右兄弟,且右兄弟數(shù)據(jù)是:%c\n\n", T->rchild->data);return OK;}if (T->rchild && T->rchild->data == e) {printf("結(jié)點(diǎn)存在左兄弟,且左兄弟數(shù)據(jù)是:%c\n\n", T->lchild->data);return OK;}m = Brother(T->lchild, e);if (m == 0) m = Brother(T->rchild, e);return m; }// 查找孩子 Status Child(BiTree T, char e) {Status m;if (T == NULL) {return 0;}if (T->data == e) {if (T->lchild && !T->rchild) {printf("存在左孩子,且左孩子數(shù)據(jù)是:%c\n\n",T->lchild->data);return OK;}if (T->rchild && !T->lchild) {printf("存在左孩子,且左孩子數(shù)據(jù)是:%c\n\n", T->rchild->data);return OK;}if (T->rchild && T->lchild) {printf("左孩子數(shù)據(jù)是:%c,右孩子數(shù)據(jù)是:%c\n\n",T->lchild->data,T->rchild->data);return OK;}}m = Child(T->lchild, e);if (m == 0) m = Child(T->rchild, e);return m; }// 二叉樹的應(yīng)用///*********** 測試 *************/ //int main(void) { // BiTree root; // CreateBiTree(root); // printf("\n"); // // //printf("先序遍歷結(jié)果是:"); // // //PreOrderTraverse1(root); // // //printf("\n"); // // //printf("中序遍歷結(jié)果是:"); // // //InOrderTraverse2(root); // // //printf("\n"); // // //printf("后序遍歷結(jié)果是:"); // // //PostOrderTraverse3(root); // // //printf("\n"); // // printf("您所創(chuàng)建的二叉樹深度是:%d\n\n", Depth(root)); // // printf("您所創(chuàng)建的二叉樹的葉子結(jié)點(diǎn)個(gè)數(shù)是:%d\n\n", LeafCount(root)); // // char data; // // printf("請您輸入要查找雙親的結(jié)點(diǎn)信息:"); // // scanf_s("%c", &data); // // if (!Parent(root, data)) { // // printf("不存在該結(jié)點(diǎn)或該結(jié)點(diǎn)是根結(jié)點(diǎn)。\a\n\n"); // // } // char data; // printf("請您輸入要查找兄弟的結(jié)點(diǎn)信息:"); // scanf_s("%c", &data); // if (!Child(root, data)) { // printf("不存在該結(jié)點(diǎn)或該結(jié)點(diǎn)是葉子結(jié)點(diǎn)。\a\n\n"); // } // return 0; //} }

    2. LinkList.h

    #include<stdio.h> #include<stdlib.h> #include"user.h"typedef struct LNode {int data;struct LNode* next; }LNode, *Linklist;Status ListInit(Linklist& L) { // 初始化L = (LNode*)malloc(sizeof(LNode));if (!L) {printf("內(nèi)存分配失敗!\a\n");exit(ERROR);}L->next = NULL;L->data = 0; //頭節(jié)點(diǎn)的數(shù)據(jù)存放結(jié)點(diǎn)個(gè)數(shù)printf("單鏈表初始化成功!\n\n");return OK; }Status ListCreate(Linklist& L) { // 創(chuàng)建(尾插法)int i; // i是循環(huán)變量int n;//n用于記錄元素個(gè)數(shù)printf("請輸入元素個(gè)數(shù):");scanf_s("%d", &n);for (i = 0; i < n; i++) {LNode* newNode = (LNode*)malloc(sizeof(LNode));if (!newNode) {printf("內(nèi)存分配失敗!\a\n");exit(ERROR);}printf("\t請輸入第%d個(gè)元素的數(shù)據(jù):", n - i);scanf_s("%d", &newNode->data);newNode->next = L->next;L->next = newNode;L->data++;}printf("單鏈表創(chuàng)建成功!\n\n");return OK; }Status ListInsert(Linklist L) { // 插入LNode* sign = L;int j = 0;int location;printf("請輸入要插入的位置:");scanf_s("%d", &location);while (sign && j < location - 1) {sign = sign->next;++j;}if (!sign || j > location - 1) {printf("位置不合法!\a\n");exit(ERROR);}LNode* newNode = (LNode*)malloc(sizeof(LNode));if (!newNode) {printf("內(nèi)存分配失敗!\a\n");exit(ERROR);}printf("請輸入要插入的數(shù)據(jù):");scanf_s("%d", &newNode->data);newNode->next = sign->next;sign->next = newNode;L->data++;printf("插入成功!\n\n");return OK; }int ListDelete(Linklist L) { //刪除int location;printf("請輸入要?jiǎng)h除元素所在的位置:");scanf_s("%d", &location);int j = 0;LNode* sign = L;while (sign->next && j < location - 1) {sign = sign->next;++j;}if (!sign || j > location - 1) {printf("位置不合法!\a\n");exit(ERROR);}LNode* temp = sign->next;sign->next = temp->next;int data = temp->data;free(temp);printf("刪除成功!\n\n");return data; }Status ListShow(Linklist& L) { //打印LNode* sign = L->next;int i = 1;printf("現(xiàn)在開始打印單鏈表中的數(shù)據(jù):\n");while (sign) {printf("\t第%d個(gè)數(shù)據(jù)是:%d\n", i++, sign->data);sign = sign->next;}printf("數(shù)據(jù)打印完畢!\n\n");return OK; }Status ListLocate(Linklist& L) { //查找int data;int location = 1; //記錄元素位置printf("請輸入您要查找的元素:");scanf_s("%d", &data);LNode* sign = L->next;while (sign && sign->data != data) {sign = sign->next;location++;}if (!sign) {printf("當(dāng)前鏈表中不存在您要查找的元素。\n\n");return FALSE;}else {printf("元素所在位置是第%d個(gè)。\n\n", location);return OK;} }// 單鏈表的應(yīng)用,多項(xiàng)式相加減 typedef struct pnode {int coef; //系數(shù)int exp; // 指數(shù)struct pnode* next; // 后繼指針 }PolyNode;PolyNode* aHead, * bHead;void DispPoly(PolyNode* head) {PolyNode* p;p = head;while (p != NULL){if (p->coef > 0 && p != head){printf("+");}if (p->exp == 0){printf("%d", p->coef);}else if (p->exp == 1){printf("%dx", p->coef);}else{printf("%dx^%d", p->coef, p->exp);}p = p->next;}printf("\n"); }void createList(PolyNode*& head) {int m; // m代表多項(xiàng)式的系數(shù)while (1){printf("\n\t\t請輸入多項(xiàng)式的項(xiàng)數(shù):");scanf_s("%d", &m);if (m != 0){break;}else{printf("\n\t\t不允許輸入 0 項(xiàng)!請重新輸入!\n");}}PolyNode* p = NULL, * s = NULL;for (int i = 0; i < m; i++){p = (PolyNode*)malloc(sizeof(PolyNode));printf("\n\t\t第%2d項(xiàng) 系數(shù):", i + 1);scanf_s("%d", &p->coef);printf("\t\t\t指數(shù):");scanf_s("%d", &p->exp);if (head == NULL){head = p;}else{s->next = p;}s = p;}s->next = NULL; }void Add(PolyNode*& ahead, PolyNode*& bhead) {PolyNode* p = NULL, * q = NULL, * s = NULL;q = aHead;while (q != NULL){p = q;q = q->next;}p->next = bHead;printf("\n\n\t\t連接:");DispPoly(aHead);q = aHead;while (q != NULL){p = q;s = q;p = p->next;while (p != NULL){if (p->exp == q->exp){q->coef = q->coef + p->coef;s->next = p->next;free(p);p = s;}s = p;p = p->next;}q = q->next;}printf("\n\t\t相加得多項(xiàng)式:");DispPoly(aHead); }void Sub(PolyNode*& ahead, PolyNode*& bhead) {PolyNode* p = NULL, * q = NULL, * s = NULL;q = aHead;while (q != NULL){p = q;if (q->coef > 0) q->coef = -(q->coef);q = q->next;}p->next = bHead;printf("\n\n\t\t連接:");DispPoly(aHead);q = aHead;while (q != NULL){p = q;s = q;p = p->next;while (p != NULL){if (p->exp == q->exp){q->coef = q->coef + p->coef;s->next = p->next;free(p);p = s;}s = p; p = p->next;}q = q->next;}printf("\n\t\t相減得多項(xiàng)式:");DispPoly(aHead); }/*********** 測試 *************/ //int main(void) { // Linklist L = NULL; // ListInit(L); //初始化單鏈表 // ListCreate(L); //創(chuàng)建單鏈表 // // ListShow(L); //打印單鏈表 // //ListInsert(L); //插入到單鏈表 // //printf("此時(shí)單鏈表中一共有%d個(gè)元素.\n", L->data); // //ListShow(L); //打印單鏈表 // //ListDelete(L); // //ListShow(L); //打印單鏈表 // ListLocate(L); //}

    3. map.h

    #include <iostream> using namespace std; #define MAX 100 //最大頂點(diǎn)數(shù) bool visited[MAX]; //標(biāo)志數(shù)組,用于標(biāo)記頂點(diǎn)是否被訪問過//邊的存儲(chǔ)結(jié)構(gòu) typedef struct BNode {int pointPosite; //該邊所指向頂點(diǎn)的位置struct BNode* nextB; //指向下一條邊的指針int info; //和邊相關(guān)的信息 }BNode;//頂點(diǎn)的存儲(chǔ)結(jié)構(gòu) typedef struct DNode {string data; //存放頂點(diǎn)信息BNode* firstB; //指針指向第一條依附該頂點(diǎn)的邊 }DNode, AdjList[MAX]; //AdjList表領(lǐng)接表類型//鄰接表的存儲(chǔ)結(jié)構(gòu) typedef struct {AdjList vertices; //頂點(diǎn)向量int DNum, BNum; //圖的當(dāng)前頂點(diǎn)數(shù)和邊數(shù) }TGraph;//順序隊(duì)列的存儲(chǔ)表示 typedef struct {string* base; //存儲(chǔ)空間的基地址int front; //頭指針int rear; //尾指針 }SqQueue;//隊(duì)列的初始化 void InitQueue(SqQueue& Q) {//構(gòu)造一個(gè)空隊(duì)列Q.base = new string[MAX];if (!Q.base){cout << "內(nèi)存分配失敗" << endl;}Q.front = Q.rear = 0; }// 入隊(duì) void EnQueue(SqQueue& Q, string e) {if ((Q.rear + 1) % MAX == Q.front){cout << "隊(duì)列已滿" << endl;}Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAX; }// 出隊(duì) string DeQueue(SqQueue& Q, string& e) {if (Q.front == Q.rear){cout << "隊(duì)列為空" << endl;}e = Q.base[Q.front];Q.front = (Q.front + 1) % MAX;return e; }// 判斷隊(duì)列是否尾空 bool Empty(SqQueue Q) {if (Q.front == Q.rear){return true;}return false; }// 找所給頂點(diǎn)在圖中的序號(hào) int LocateVex(TGraph G, string v) {for (int i = 0; i < G.DNum; ++i){if (v == G.vertices[i].data){return i;}}return -1; }// 鄰接表創(chuàng)建無向圖 void CreateUDG(TGraph& G) //無向圖UDG {string v1, v2;cout << "請輸入所要?jiǎng)?chuàng)建圖的總頂點(diǎn)數(shù)和總邊數(shù):";cin >> G.DNum >> G.BNum; //輸入總頂點(diǎn)數(shù)和總邊數(shù)for (int i = 0; i < G.DNum; ++i) //輸入各點(diǎn),構(gòu)造表頭結(jié)點(diǎn)表{cout << "請輸入第" << i + 1 << "個(gè)頂點(diǎn)的值:";cin >> G.vertices[i].data; //輸入頂點(diǎn)值G.vertices[i].firstB = NULL;//初始化表頭結(jié)點(diǎn)指針域?yàn)榭?/span>}for (int k = 0; k < G.BNum; ++k) //輸入各邊,構(gòu)造領(lǐng)接表{BNode* p1, * p2;cout << "請輸入第" << k + 1 << "條邊的信息:";cin >> v1 >> v2; //輸入一條邊依附的兩個(gè)頂點(diǎn)int m = LocateVex(G, v1); int n = LocateVex(G, v2); //得到v1 v2在G.vertices中的序號(hào)p1 = new BNode; //生成一個(gè)新的邊結(jié)點(diǎn)*p1p1->pointPosite = n; //鄰接點(diǎn)序號(hào)為np1->nextB = G.vertices[m].firstB; //頭插法G.vertices[m].firstB = p1;p2 = new BNode;p2->pointPosite = m;p2->nextB = G.vertices[n].firstB;G.vertices[n].firstB = p2;}cout << "無向圖創(chuàng)建成功。\n\n"; }// 打印圖的鄰接表 void UDGprint(TGraph G) {BNode* p;for (int i = 0; i < G.DNum; ++i){cout << G.vertices[i].data;p = G.vertices[i].firstB;while (p){cout << ": ";cout << p->pointPosite;p = p->nextB;}cout << endl;} }// 深度優(yōu)先遍歷 void deepTravel(TGraph G, string v) {int b, w;BNode* p;cout << v << " ";b = LocateVex(G, v);visited[b] = true; //訪問第b個(gè)頂點(diǎn),標(biāo)志為truep = G.vertices[b].firstB; //p指向v的邊鏈表的第一個(gè)邊結(jié)點(diǎn)while (p != NULL) //如果p不為空{w = p->pointPosite; //w為v的第一個(gè)邊結(jié)點(diǎn)if (!visited[w]) //若w未被訪問 則繼續(xù)遞歸{string a;for (int i = 0; i < G.DNum; ++i){if (w == i){a = G.vertices[i].data;}}deepTravel(G, a);}p = p->nextB; //否則p指向下一個(gè)v的邊結(jié)點(diǎn)} }// 廣度優(yōu)先遍歷 void breadthTravel(TGraph G, string v) {BNode* p;int l;string e;int b = LocateVex(G, v);SqQueue Q;InitQueue(Q);for (int i = 0; i < G.DNum; i++)visited[i] = false;if (!visited[b]){visited[b] = true;cout << v << " ";EnQueue(Q, v);while (!Empty(Q)){string s = DeQueue(Q, e);int u = LocateVex(G, s);p = G.vertices[u].firstB;while (p){l = p->pointPosite;if (!visited[l]){visited[l] = true;cout << G.vertices[l].data << " ";EnQueue(Q, G.vertices[l].data);}p = p->nextB;}}} }// 查找第一個(gè)鄰接點(diǎn) int FirstAdjVex(TGraph G, string v) {BNode* p;int v1;v1 = LocateVex(G, v);//v1為頂點(diǎn)v在圖G中的序號(hào)p = G.vertices[v1].firstB;if (p){return p->pointPosite;}else{return -1;} }// 查找下一個(gè)鄰接點(diǎn) int NextAdjVex(TGraph G, string v, string w) {BNode* p;int v1, v2;v1 = LocateVex(G, v);//v1為頂點(diǎn)v在圖G中的序號(hào)v2 = LocateVex(G, w);//v2為頂點(diǎn)v在圖G中的序號(hào)p = G.vertices[v1].firstB;for (; p->nextB && p->pointPosite != v2; p = p->nextB);if (p->nextB && p->pointPosite == v2){return p->nextB->pointPosite;}else{return -1;} }// 插入結(jié)點(diǎn) void InsertNode(TGraph& G, string data) {G.DNum++;G.vertices[G.DNum - 1].data = data;G.vertices[G.DNum - 1].firstB = NULL;printf("插入成功。\n\n"); }// 刪除結(jié)點(diǎn) void DeleteNode(TGraph& G, string data) {int c = LocateVex(G, data);BNode* p, * q;for (int i = 0; i < G.DNum; ++i){p = G.vertices[i].firstB;q = p;if (G.vertices[i].firstB->pointPosite)if (c > G.vertices[i].firstB->pointPosite){q = p;p = p->nextB;}else if (G.vertices[i].firstB->pointPosite == c){G.vertices[i].firstB = p->nextB;q = G.vertices[i].firstB;p = p->nextB;while (p){if (c > p->pointPosite){q = p;p = p->nextB;}else{p->pointPosite -= 1;q = p;p = p->nextB;}}continue;}else{G.vertices[i].firstB->pointPosite -= 1;q = p;p = p->nextB;}while (p){if (c > p->pointPosite){p = p->nextB;}else if (c == p->pointPosite){q->nextB = p->nextB;p = p->nextB;while (p){if (c > p->pointPosite){p = p->nextB;}else{p->pointPosite -= 1;p = p->nextB;}}continue;}else{p->pointPosite -= 1;q = p;p = p->nextB;}}}for (int j = 0; j < G.DNum; j++){if (G.vertices[j].data == data){for (; j < G.DNum; j++){G.vertices[j] = G.vertices[j + 1];}G.DNum -= 1;break;}} }/**********應(yīng)用**********/ // 判斷圖的聯(lián)通性 bool Judge(TGraph G) {for (int v = 0; v < G.DNum; v++){visited[v] = false;}deepTravel(G, G.vertices[0].data); //從任意一點(diǎn)遍歷,這里從下標(biāo)為0的點(diǎn)開始for (int v = 0; v < G.DNum; v++){if (!visited[v]){return false;}}return true; }/**************測試***************/ //int main() //{ // string ch; // TGraph G; // CreateUDG(G); // cout << "建立的鄰接表如下: " << endl; // UDGprint(G); // cout << "請輸入遍歷開始的結(jié)點(diǎn):"; // cin >> ch; // cout << "深度遍歷序列為: "; // deepTravel(G, ch); // cout << "\n廣度遍歷序列為: "; // breadthTravel(G, ch); // return 0; //}

    完整下載鏈接

    數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

    總結(jié)

    以上是生活随笔為你收集整理的数据结构课程设计(C语言实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。