实验一 链表
#include#include #define ERROR NULL typedef int ElementType; typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List; List CreateFromTail() { List L; Position r, s; int c; int flag =1; L=(List)malloc(sizeof(struct LNode));//为头结点分配存储空间 L->Next=NULL; r=L; //r指针始终动态指向链表的当前表尾 printf("请输入整数,以0结束:"); while(flag) //flag为标志,初值为1。输入“$”时flag为0,建表结束 { scanf("%d",&c); if(c!=0) { s=(Position)malloc(sizeof(struct LNode)); s->Data=c; r->Next=s; r=s; } else { flag=0; r->Next=NULL; } } return L; } Position FindKth( List L, int K ) { //根据指定的位序K,返回L中相应元素 Position p; int cnt = 1; //位序从1开始 p = L->Next; //p指向L的第1个结点 while ( p && cnt Next; cnt++; } if (cnt==K) return p; //找到第K个 else return ERROR; //否则返回错误信息 } Position Find( List L, ElementType X ) { Position p = L; while ( p && p->Data!=X ) p = p->Next; if ( p ) return p; else return ERROR; } void PrintLL (List L) { Position p; p = L->Next; printf("链表结点数据为:"); while(p!=NULL) { printf("%d ",p->Data); p=p->Next; } printf("n"); } bool Insert( List L, ElementType X, int i ) { Position tmp, pre; int cnt = 0; pre = L; while ( pre && cnt Next; cnt++; } if ( pre==NULL ) { printf("插入位置参数错误n"); return false; } else { tmp=(Position)malloc(sizeof(struct LNode)); tmp->Data = X; tmp->Next = pre->Next; pre->Next = tmp; return true; } } bool Delete( List L, int i ) { Position tmp, pre; int cnt = 0; pre = L; while ( pre->Next!=NULL && cnt Next; cnt++; } if (pre->Next==NULL) { printf("插入位置参数错误n"); return false; } else { tmp=pre->Next; pre->Next=tmp->Next; free(tmp); return true; } } int main() { List l; Position p; ElementType e; int k; l=CreateFromTail(); PrintLL (l); printf("请输入要查询第几个结点:"); scanf("%d",&k); p=FindKth(l, k ); if(p==ERROR) printf("第%d个结点不存在",k); else printf("第%d个结点的值为:%dn",k,p->Data); printf("请输入要查找的元素值:n"); scanf("%d",&e); p=Find(l,e); if(p == ERROR) printf("在此线性表中没有该元素!n"); else printf("元素%d在链表中!n",e); printf("请输入要插入的位置:n"); scanf("%d",&k); printf("请输入要插入的元素值:n"); scanf("%d",&e); Insert(l,e,k); printf("线性表中各元素的值为:n"); PrintLL (l); printf("请输入要删除的位置:n"); scanf("%d",&k); Delete(l,k); PrintLL (l); return 0; }
实验二 顺序表
#include实验三括号匹配#include #define MAXSIZE 1000 #define ElementType int #define ERROR -1 typedef int Position; typedef struct LNode *PtrToLNode; struct LNode { ElementType Data[MAXSIZE]; Position Last; }; typedef PtrToLNode List; List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; return L; } void Print(List L) { Position i; for(i=0; i<=L->Last; i++) { printf("%d ",L->Data[i]); } printf("n"); } bool Insert( List L, ElementType X ) { Position i=0,j; if ( L->Last == MAXSIZE-1) { printf("表满"); return false; } while(L->Data[i] Last) i++; for( j=L->Last; j>=i; j-- ) L->Data[j+1] = L->Data[j]; L->Data[i] = X; L->Last++; return true; } void Make(List L) { int i,len; ElementType q; printf("请输入线性表的长度:"); scanf("%d",&len); printf("请输入线性表的各元素值:n"); scanf("%d",&L->Data[0]); L->Last = 0; //printf("线性表中各元素的值为:n"); // Print(L); for(i=1; i Last && L->Data[i]!= X ) i++; if ( i > L->Last ) return ERROR; else return i; } bool Delete( List L, int i ) { Position j; for( j=i; j<=L->Last; j++ ) L->Data[j-1] = L->Data[j]; L->Last--; return true; } int main() { List l; ElementType q; Position p; l=MakeEmpty(); Make(l); printf("线性表中各元素的值为:n"); Print(l); printf("请输入要插入的元素值:n"); scanf("%d",&q); Insert(l,q); printf("线性表中各元素的值为:n"); Print(l); printf("请输入要查找的元素值:n"); scanf("%d",&q); p=Find(l,q); if(p == ERROR) printf("在此线性表中没有该元素!n"); else { printf("该元素在线性表中的位置为:%dn",p+1); Delete(l,p+1); printf("删除元素%d后,线性表中各元素的值为:n",q); Print(l); } return 0; }
#include#include #define ElementType char #define MaxSize 50 typedef struct SNode { ElementType Data[MaxSize]; int Top; }*Stack; Stack CreateStack() { Stack S = (Stack)malloc(sizeof(struct SNode)); S->Top = -1; return S; } bool IsFull( Stack S ) { return (S->Top == MaxSize-1); } bool Push( Stack S, ElementType X ) { if ( IsFull(S) ) { printf("堆栈满"); return false; } else { S->Data[++(S->Top)] = X; return true; } } bool IsEmpty( Stack S ) { return (S->Top == -1); } bool Pop( Stack S, ElementType *x ) { if ( IsEmpty(S) ) { printf("堆栈空"); return false; } else { *x=S->Data[S->Top]; (S->Top)--; return true; } } bool GetTop(Stack S,ElementType *x) { if(S->Top == -1) return false; else { *x = S->Data[S->Top]; return true; } } bool Match(char ch,char str) { if(ch=='(' && str==')') { return true; } else if(ch=='[' && str==']') { return true; } else if(ch=='{' && str=='}') { return true; } else return false; } void BracketMatch(char *str) { Stack S; int i; char ch; S=CreateStack(); for(i=0; str[i]!=' '; i++) { switch(str[i]) { case '(': case '[': case '{': Push(S,str[i]); break; case ')': case ']': case '}': if(IsEmpty(S)) { printf("n右括号多余!"); return; } else { GetTop(S,&ch); if(Match(ch,str[i])) Pop(S,&ch); else { printf("n对应的左右括号不同类!"); return; } } } } if(IsEmpty(S)) printf("n括号匹配!"); else printf("n左括号多余!"); } int main() { char str[100]; printf("请输入括号:n"); gets(str); BracketMatch(str); return 0; }
实验四 多项式的加法
#include#include typedef struct Polynode { int coef; int exp; Polynode *next; }Polynode, *Polylist; void polycreate(Polylist head) { Polynode *rear, *s; int c,e; rear=head; scanf("%d,%d",&c,&e); while(c!=0) { s=(Polynode*)malloc(sizeof(Polynode)); s->coef=c; s->exp=e; rear->next=s; rear=s; scanf("%d,%d",&c,&e); } rear->next=NULL; } void polyadd(Polylist polya, Polylist polyb) { Polynode *p, *q, *r, *temp; int sum; p=polya->next; q=polyb->next; r=polya; while (p!=NULL && q!=NULL) { if (p->exp < q->exp) { r->next=p; r=p; p=p->next; } else if ( p->exp == q->exp) { sum=p->coef + q->coef; if (sum != 0) { p->coef=sum; r->next=p; r=p; p=p->next; temp=q; q=q->next; free(temp); } else { temp=p; p=p->next; free(temp); temp=q; q=q->next; free(temp); } } else { r->next=q; r=q; q = q->next; } } if(p!=NULL) r->next=p; else r->next=q; } void polyprint(Polylist poly) { Polynode *p; p = poly->next; if(p!=NULL) { if(p->coef==1) printf("x^%d",p->exp); else if(p->coef==-1) printf("-x^%d",p->exp); else printf("%dx^%d",p->coef,p->exp); p=p->next; } while(p!=NULL) { if(p->coef>0) { if(p->coef==1) printf("+x^%d",p->exp); else printf("+%dx^%d",p->coef,p->exp); } else { if(p->coef==-1) printf("-x^%d",p->exp); else printf("%dx^%d",p->coef,p->exp); } p=p->next; } } int main() { Polylist polya,polyb; printf("请输入数据建立多项式A:(以0,0结束!)n"); polya=(Polynode *)malloc(sizeof(Polynode)); polycreate(polya); printf("P(A)="); polyprint(polya); printf("n请输入数据建立多项式B:(以0,0结束!)n"); polyb=(Polynode *)malloc(sizeof(Polynode)); polycreate(polyb); printf("P(B)="); polyprint(polyb); polyadd(polya,polyb); printf("n相加后的多项式为:n"); printf("P(C)="); polyprint(polya); return 0; }
实验五 二叉树的遍历
#include#include #define MaxSize 50 #define ERROR NULL typedef char ElementType; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; typedef BinTree ElemType; typedef struct QNode *PtrToQNode; struct QNode { ElemType Data[MaxSize]; int Front, Rear; }; typedef PtrToQNode Queue; BinTree CreateBinTree() { BinTree bt; char ch; ch=getchar(); if(ch=='|') bt=NULL; else { bt=(BinTree)malloc(sizeof(struct TNode)); bt->Data=ch; bt->Left=CreateBinTree(); bt->Right=CreateBinTree(); } return bt; } void PreorderTraversal( BinTree BT ) { if( BT ) { printf("%c ", BT->Data ); PreorderTraversal( BT->Left ); PreorderTraversal( BT->Right ); } } void InorderTraversal( BinTree BT ) { if( BT ) { InorderTraversal( BT->Left ); printf("%c ", BT->Data); InorderTraversal( BT->Right ); } } void PostorderTraversal( BinTree BT ) { if( BT ) { PostorderTraversal( BT->Left ); PostorderTraversal( BT->Right ); printf("%c ", BT->Data); } } Queue CreateQueue() { Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Front = Q->Rear = 0; return Q; } bool IsFull( Queue Q ) { return ((Q->Rear+1)%MaxSize == Q->Front); } bool AddQ( Queue Q, ElemType X ) { if ( IsFull(Q) ) { printf("队列满"); return false; } else { Q->Rear = (Q->Rear+1)%MaxSize; Q->Data[Q->Rear] = X; return true; } } bool IsEmpty( Queue Q ) { return (Q->Front == Q->Rear); } ElemType DeleteQ( Queue Q ) { if ( IsEmpty(Q) ) { printf("队列空"); return ERROR; } else { Q->Front =(Q->Front+1)%MaxSize; return Q->Data[Q->Front]; } } void LevelorderTraversal ( BinTree BT ) { Queue Q; BinTree T; if ( !BT ) return; Q = CreateQueue(); AddQ( Q, BT ); while ( !IsEmpty(Q) ) { T = DeleteQ( Q ); printf("%c ", T->Data); if ( T->Left ) AddQ( Q, T->Left ); if ( T->Right ) AddQ( Q, T->Right ); } } int main() { BinTree T; printf("请按照先序输入节点,空节点请用‘|’代替n"); T=CreateBinTree(); printf("n按先序遍历输出:n"); PreorderTraversal(T); printf("n按中序遍历输出:n"); InorderTraversal(T); printf("n按后序遍历输出:n"); PostorderTraversal(T); printf("n按层序遍历输出:n"); LevelorderTraversal(T); printf("n"); return 0; }
实验六 数表的查找
#include#include #define ENDKEY 0 typedef int ElementType; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; BinTree Insert( BinTree BST, ElementType X ) { if( !BST ){ BST = (BinTree)malloc(sizeof(struct TNode)); BST->Data = X; BST->Left = BST->Right = NULL; } else { if( X < BST->Data ) BST->Left = Insert( BST->Left, X ); else if( X > BST->Data ) BST->Right = Insert( BST->Right, X ); } return BST; } BinTree CreateBST() { BinTree bst; ElementType key; bst=NULL; scanf("%d", &key); while (key!=ENDKEY) { bst=Insert(bst, key); scanf("%d", &key); } return bst; } void InorderTraversal( BinTree BT ) { if( BT ) { InorderTraversal( BT->Left ); printf("%d ", BT->Data); InorderTraversal( BT->Right ); } } Position FindMax( BinTree BST ) { if( BST ) while( BST->Right ) BST = BST->Right; return BST; } Position FindMin( BinTree BST ) { if( !BST ) return NULL; else if( !BST->Left ) return BST; else return FindMin( BST->Left ); } Position Find( BinTree BST, ElementType X ) { while( BST ) { if( X > BST->Data ) BST = BST->Right; else if( X < BST->Data ) BST = BST->Left; else break; } return BST; } int main() { BinTree T; int k; BinTree result; printf("建立二叉排序树,请输入序列(0结束):n"); T=CreateBST(); printf("中序遍历输出序列为:"); InorderTraversal(T); result = FindMax(T); printf("n此二叉排序树中的最大值为:%dn",result->Data); result = FindMin(T); printf("此二叉排序树中的最小值为:%dn",result->Data); printf("n请输入要查找的元素:"); scanf("%d",&k); result = Find(T,k); if (result != NULL) printf("要查找的元素%d在二叉排序树中!n",result->Data); else printf("未找到!n"); return 0; }
实验七 图及其遍历
#include "stdlib.h"
#include "stdio.h"
#define MAX_VERTEX_NUM 10
#define INFINITY 32768
#define True 1
#define False 0
#define Error -1
#define Ok 1
typedef enum{DG, DN, UDG, UDN} GraphKind;
typedef char VertexData;
typedef struct ArcNode
{
int adj;
} ArcNode;
typedef struct
{
VertexData vexs[MAX_VERTEX_NUM];
ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum,arcnum;
GraphKind kind;
}AdjMatrix;
typedef struct Node
{
int data;
struct Node *next;
}LinkQueueNode;
typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;
int InitQueue(LinkQueue *Q)
{
Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
return(True);
}
else
return(False);
}
int EnterQueue(LinkQueue *Q,int x)
{
LinkQueueNode *NewNode;
NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(NewNode!=NULL)
{
NewNode->data=x;
NewNode->next=NULL;
Q->rear->next=NewNode;
Q->rear=NewNode;
return(True);
}
else
return(False);
}
int DeleteQueue(LinkQueue *Q,int *x)
{
LinkQueueNode *p;
if(Q->front==Q->rear)
return(False);
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
*x=p->data;
free(p);
return(True);
}
int IsEmpty(LinkQueue *Q)
{
if(Q->front==Q->rear)
return(True);
else
return(False);
}
int LocateVertex(AdjMatrix *G,VertexData v)
{
int j=Error,k;
for(k=0;kvexnum;k++)
if(G->vexs[k]==v)
{
j=k;
break;
}
return(j);
}
void CreateUDG(AdjMatrix *G)
{
int i,j,k;
VertexData v1,v2;
printf("输入图的边数,顶点数:n");
fflush(stdin);
scanf("%d,%d",&G->arcnum,&G->vexnum);
for(i=0;ivexnum;i++)
for(j=0;jvexnum;j++)
G->arcs[i][j].adj=0;
for(i=0;ivexnum;i++)
{
printf("输入图的顶点:n");
fflush(stdin);
scanf("%c",&G->vexs[i]);
}
for(k=0;karcnum;k++)
{
printf("输入一条边的两个顶点:n");
fflush(stdin);
scanf("%c,%c",&v1,&v2);
i=LocateVertex(G,v1);
j=LocateVertex(G,v2);
G->arcs[i][j].adj=1; G->arcs[j][i].adj=1;
}
}
void output(AdjMatrix *G)
{
int i,j,k=1;
printf("输出图的顶点:n");
for(i=0;ivexnum;i++)
printf("%c ",G->vexs[i]);
printf("n输出图的边:n");
for(i=0;ivexnum;i++)
for(j=i;jvexnum;j++)
{
if(G->arcs[i][j].adj==1)
{
printf("第%d条边为:%c--%c n",k,G->vexs[i],G->vexs[j]);
k++;
}
}
}
int visited[MAX_VERTEX_NUM];
void DFS(AdjMatrix g, int v0)
{
int vj;
printf("%c ",g.vexs[v0]);
visited[v0]=True;
for ( vj=0;vj
`



