优化这段代码的运行时间#include<stdio.h> #include<stdlib.h> typedef struct node* DNode; struct node { int data; DNode prior; //前面数据地址 DNode next; //后面数据地址 }; //创建双向链表 void CreatNode(DNode *head) { DNode s; //新节点指针 char e; (*head) = (DNode)malloc(sizeof(struct node));//头结点 (*head)->prior = (*head); //初始头结点的前驱和后驱都指向自己 (*head)->next = (*head); printf("输入数据\n"); scanf("%c", &e); while (e!='\n') { s = (DNode)malloc(sizeof(struct node)); //新节点分配空间 s->data = e; s->prior = (*head); //新节点的prior连前一个结点 s->next = (*head)->next; //新节点的next连后边结点 (*head)->next->prior = s; //后一个结点的prior连新结点 (*head)->next = s; //新节点前面的next连新结点 scanf("%c", &e); } } //向后遍历输出 void PrintList1(DNode L) { DNode p; p = L; p = p->next; while (p != L) { printf("%c", p->data); p = p->next; } printf("\n"); } //向前遍历输出 void PrintList2(DNode L) { DNode p; p = L->prior; while (p != L) { printf("%c", p->data); p = p->prior; } printf("\n"); } //查找第i处数据的地址 DNode FindPosition(DNode L,int i) { int j = 0; DNode p = L; while (p->next != L&&j < i) { p = p->next; j++; } return p; } //插入 void InsertList(DNode L) { DNode s,p; //s为新结点 p为新节点前一个结点 int i; char e; printf("在第几处插入:\n"); scanf("%d", &i); getchar(); printf("插入什么数据:\n"); scanf("%c", &e); p = FindPosition(L, i-1); //新节点前一个结点地址 s = (DNode)malloc(sizeof(struct node));//申请新节点空间 s->data = e; s->prior = p; //新节点的prior连上前一个结点 s->next = p->next; //新节点的next连上后一个结点 p->next->prior = s; //新节点后的结点的prior连上新结点 p->next = s; //新节点前的结点的next连上新结点 } //删除 void DeleteList(DNode L){ DNode s,p; //s为新结点 p为要删除的结点 int i; printf("删除第几处的数据:\n"); scanf("%d", &i); p = FindPosition(L, i); //要删除结点的地址 p->prior->next = p->next; //要删除的结点的前一个结点的next,连上要删结点后的结点 p->next->prior = p->prior;//要删除结点的后一个结点的prior,连上要删结点的前一个结点 free(p); } int main() { DNode list; CreatNode(&list); //PrintList1(list); PrintList2(list); InsertList(list); PrintList2(list); DeleteList(list); PrintList2(list); }
时间: 2023-05-17 15:04:41 浏览: 131
要优化这段代码的运行时间,可以考虑以下几个方面:
1. 减少循环次数:如果代码中有循环语句,可以尝试减少循环次数,比如使用更高效的算法或数据结构来代替循环。
2. 减少重复计算:如果代码中有重复计算的部分,可以尝试将其缓存起来,避免重复计算。
3. 减少函数调用:函数调用会带来一定的开销,如果代码中有频繁的函数调用,可以尝试将其合并或优化。
4. 使用并行计算:如果代码中有可以并行计算的部分,可以尝试使用多线程或分布式计算来加速运行。
5. 优化内存使用:如果代码中有大量的内存分配和释放操作,可以尝试优化内存使用,比如使用对象池或缓存来避免频繁的内存分配和释放。
6. 使用更高效的数据结构和算法:如果代码中使用的数据结构和算法不够高效,可以尝试使用更高效的数据结构和算法来代替。
相关问题
请用C语言写一段定义双链表的代码,并指出它和单链表在代码上的不同。
下面是一段C语言代码,定义了双链表:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode{
int data;
struct DNode *pre;
struct DNode *next;
} DNode, *DLinkedList;
DLinkedList createDLinkedList() {
DNode *head = (DNode *)malloc(sizeof(DNode));
head->next = NULL;
head->pre = NULL;
return head;
}
void addDNode(DLinkedList L, int data) {
DNode *newNode = (DNode *)malloc(sizeof(DNode));
newNode->data = data;
newNode->next = L->next;
newNode->pre = L;
if (L->next != NULL) {
L->next->pre = newNode;
}
L->next = newNode;
}
void deleteDNode(DLinkedList L, int data) {
DNode *p = L->next;
while (p != NULL && p->data != data) {
p = p->next;
}
if (p != NULL) {
p->pre->next = p->next;
if (p->next != NULL) {
p->next->pre = p->pre;
}
free(p);
}
}
```
和单链表相比,双链表不仅保存了后继节点的指针,还保存了前驱节点的指针。在代码实现上,这就意味着双链表操作需要多维护前驱节点的指针。
把其中的所有代码打出来
以下是《数据结构实验指导书 实验三 树和二叉树.pdf》中的所有代码:
### BTree.h
```c
#ifndef INC_BTREE_H
#define INC_BTREE_H
#include <stdlib.h>
#include <stdio.h>
typedef char ElemType;
typedef struct node {
ElemType data;
struct node *lchild;
struct node *rchild;
} BTNode;
typedef struct dnode {
BTNode *data;
struct dnode *next;
} DataNode;
typedef struct qnode {
DataNode *front;
DataNode *rear;
} QueueNode;
typedef struct snode {
BTNode *data;
struct snode *next;
} StackNode;
void InitStack(StackNode *&S) {
S = (StackNode *)malloc(sizeof(StackNode));
S->next = NULL;
}
void DestroyStack(StackNode *&S) {
StackNode *p = S, *t;
while (p != NULL) {
t = p->next;
free(p);
p = t;
}
}
bool Push(StackNode *S, BTNode *e) {
StackNode *t = (StackNode *)malloc(sizeof(StackNode));
t->data = e;
t->next = S->next;
S->next = t;
return true;
}
bool Pop(StackNode *S, BTNode *&e) {
StackNode *t;
if (S->next == NULL)
return false;
t = S->next;
e = t->data;
S->next = t->next;
free(t);
return true;
}
bool GetTop(StackNode *S, BTNode *&e) {
if (S->next == NULL)
return false;
e = S->next->data;
return true;
}
void InitQueue(QueueNode *&q) {
q = (QueueNode *)malloc(sizeof(QueueNode));
q->front = NULL;
q->rear = NULL;
}
void DestroyQueue(QueueNode *&q) {
DataNode *s = q->front, *t;
while (s != NULL) {
t = s->next;
free(s);
s = t;
}
free(q);
}
bool QueueEmpty(QueueNode *q) {
return (q->front == NULL && q->rear == NULL);
}
bool enQueue(QueueNode *&q, BTNode *e) {
DataNode *t = (DataNode *)malloc(sizeof(DataNode));
t->data = e;
if (QueueEmpty(q)) {
q->front = t;
q->rear = t;
} else {
q->rear->next = t;
q->rear = t;
}
return true;
}
bool deQueue(QueueNode *&q, BTNode *&e) {
DataNode *t;
if (QueueEmpty(q))
return false;
t = q->front;
e = t->data;
if (q->front == q->rear) {
q->front = NULL;
q->rear = NULL;
} else {
q->front = t->next;
}
free(t);
return true;
}
void CreateBTree(BTNode *&b, char *str) {
int i = 0, k;
char ch = str[i];
BTNode *t;
BTNode **q;
b = NULL;
StackNode *S;
InitStack(S);
while (ch != '\0') {
switch (ch) {
case '(':
Push(S, t);
k = 1;
break;
case ')':
Pop(S, q);
break;
case ',':
k = 2;
break;
default:
t = (BTNode *)malloc(sizeof(BTNode));
t->data = ch;
t->lchild = NULL;
t->rchild = NULL;
if (b == NULL)
b = t;
else {
GetTop(S, q);
if (k == 1)
q->lchild = t;
else
q->rchild = t;
}
break;
}
i++;
ch = str[i];
}
DestroyStack(S);
}
void DestroyBTree(BTNode *&b) {
if (b != NULL) {
DestroyBTree(b->lchild);
DestroyBTree(b->rchild);
free(b);
}
}
BTNode *FindNode(BTNode *b, ElemType e) {
BTNode *t;
if (b == NULL)
return NULL;
if (e == b->data)
return b;
t = FindNode(b->lchild, e);
if (t != NULL)
return t;
else
return FindNode(b->rchild, e);
}
BTNode *LchildNode(BTNode *b) {
return b->lchild;
}
BTNode *RchildNode(BTNode *b) {
return b->rchild;
}
int BTHeight(BTNode *b) {
int hL, hR;
if (b == NULL)
return 0;
hL = BTHeight(b->lchild);
hR = BTHeight(b->rchild);
if (hL > hR)
return hL + 1;
else
return hR + 1;
}
void DispBTree(BTNode *b) {
if (b != NULL) {
printf("%c", b->data);
if (b->lchild != NULL || b->rchild != NULL) {
printf("(");
DispBTree(b->lchild);
if (b->rchild != NULL)
printf(",");
DispBTree(b->rchild);
printf(")");
}
}
}
void PreOrder(BTNode *b) {
if (b != NULL) {
printf("%c", b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
void InOrder(BTNode *b) {
if (b != NULL) {
InOrder(b->lchild);
printf("%c", b->data);
InOrder(b->rchild);
}
}
void PostOrder(BTNode *b) {
if (b != NULL) {
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c", b->data);
}
}
void LevelOrder(BTNode *b) {
QueueNode *q;
BTNode *e;
if (b == NULL)
return;
InitQueue(q);
enQueue(q, b);
while (!QueueEmpty(q)) {
deQueue(q, e);
printf("%c", e->data);
if (e->lchild != NULL)
enQueue(q, e->lchild);
if (e->rchild != NULL)
enQueue(q, e->rchild);
}
DestroyQueue(q);
}
#endif
```
### BTree.cpp
```c
#include <stdio.h>
#include <stdlib.h>
#include "BTree.h"
int main(void) {
BTNode *b;
BTNode *h;
char *str = "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))";
printf("实验三:树和二叉树,问题一:二叉树的创建和遍历,完成人:XXX\n");
printf("(1)用括号表示串创建二叉树b。\n");
CreateBTree(b, str);
printf("(2)输出二叉树b:");
DispBTree(b);
printf("\n");
printf("(3)输出H结点的左右孩子结点值:");
h = FindNode(b, 'H');
printf("左孩子结点:%c,右孩子结点:%c。\n", LchildNode(h)->data, RchildNode(h)->data);
printf("(4)输出二叉树b的高度:");
printf("%d。\n", BTHeight(b));
printf("(5)输出二叉树先序序列:");
PreOrder(b);
printf("\n");
printf("(6)输出二叉树b中序序列:");
InOrder(b);
printf("\n");
printf("(7)输出二叉树b后序序列:");
PostOrder(b);
printf("\n");
printf("(8)输出二叉树b层序序列:");
LevelOrder(b);
printf("\n");
printf("(9)释放二叉树b。\n");
DestroyBTree(b);
return 0;
}
```
### CreateBTree.h
```c
#ifndef INC_CREATE_B_TREE_H
#define INC_CREATE_B_TREE_H
#include <stdlib.h>
#include <stdio.h>
typedef char ElemType;
typedef struct node {
ElemType data;
struct node *lchild;
struct node *rchild;
} BTNode;
BTNode *CreateBT1(char *pre, char *in, int n) {
BTNode *bt;
int k;
if (n <= 0)
return NULL;
bt = (BTNode *)malloc(sizeof(BTNode));
bt->data = *pre;
for (k = 0; k < n; k++) {
if (*(in + k) == bt->data)
break;
}
bt->lchild = CreateBT1(pre + 1, in, k);
bt->rchild = CreateBT1(pre + k + 1, in + k + 1, n - k - 1);
return bt;
}
BTNode *CreateBT2(char *post, char *in, int n) {
BTNode *bt;
int k;
if (n <= 0)
return NULL;
bt = (BTNode *)malloc(sizeof(BTNode));
bt->data = *(post + n - 1);
for (k = 0; k < n; k++) {
if (*(in + k) == bt->data)
break;
}
bt->lchild = CreateBT2(post, in, k);
bt->rchild = CreateBT2(post + k, in + k + 1, n - k - 1);
return bt;
}
void DestroyBTree(BTNode *b) {
if (b != NULL) {
DestroyBTree(b->lchild);
DestroyBTree(b->rchild);
free(b);
}
}
void PreOrder(BTNode *b) {
if (b != NULL) {
printf("%c", b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
void InOrder(BTNode *b) {
if (b != NULL) {
InOrder(b->lchild);
printf("%c", b->data);
InOrder(b->rchild);
}
}
void PostOrder(BTNode *b) {
if (b != NULL) {
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c", b->data);
}
}
#endif
```
### CreateBTree.cpp
```c
#include <stdio.h>
#include <stdlib.h>
#include "CreateBTree.h"
int main(void) {
BTNode *b1;
BTNode *b2;
char *pre = "ABDEHJKLMNCFGI";
char *in = "DBJHLKMNEAFCGI";
char *post = "DJLNMKHEBFIGCA";
printf("实验三:树和二叉树,问题二:二叉树的构造,完成人:XXX\n");
printf("(1)用先序和中序序列创建二叉树b1。\n");
b1 = CreateBT1(pre, in, 14);
printf("(2)输出二叉树b1的后序序列:");
PostOrder(b1);
printf("\n");
printf("(3)用后序和中序序列创建二叉树b2。\n");
b2 = CreateBT2(post, in, 14);
printf("(4)输出二叉树b2的先序序列:");
PreOrder(b2);
printf("\n");
printf("(5)释放二叉树b1和b2。\n");
DestroyBTree(b1);
DestroyBTree(b2);
return 0;
}
```
这些代码实现了二叉树的创建、遍历和销毁等功能,并且通过不同的输入方式(括号表示法、先序和中序序列、后序和中序序列)构建了二叉树。希望这些代码对你有帮助!
阅读全文