C
链表的实现
利用 C 语言结构体类型定义单链表:
typedef struct node{
ElemType data;
struct node *next;
}LNode,*LinkList;
#ifndef _LINK_H
#define _LINK_H
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
enum BOOL{False,True};
typedef struct{
int sn;
char name[10];
float score;
}Stu;
typedef Stu ElemType;
typedef struct node{
ElemType data;
struct node *next;
}LNode,*LinkList;
void CreatList(LinkList &L,int n);
BOOL ListInsert(LinkList &L,int i,ElemType e);
BOOL ListDelete(LinkList &L,int i,ElemType &e);
False
BOOL ListFind_keyword(LinkList L,ElemType e,int &i);
BOOL ListFind_loc(LinkList L,int i,ElemType &e);
void ListPrint(LinkList L);
void DestroyLink(LinkList &L);
int CompareElemType(ElemType a,ElemType b);
#endif
3. 将接口实现放在 Link.cpp 里,文件内容如下:
#include <string.h>
#include "link.h"
void CreatList(LinkList &L,int n){
int i;
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("使用头插法,请逆序位输入%d 个学生信息(学号 姓名 分数),如 101 张三 97.5:
\n",n);
getchar();
for(i=n;i>0;--i) {
p=(LinkList)malloc(sizeof(LNode));
if(!p) exit(1);
scanf("%d %s %f",&p->data.sn,&p->data.name,&p->data.score);
p->next=L->next;
L->next=p;
}
printf("%d 个结点的链表已经建立\n",n);
}
BOOL ListInsert(LinkList &L,int i,ElemType e){
回 True,失败返回 False
LinkList s,p=L;
int j=0;
while(p && j<i-1) {
p=p->next; ++j;
}
if(!p || j>i-1) return False;
s=(LinkList)malloc(sizeof(LNode));
if(!s) exit(1);
s->data.sn=e.sn; strcpy(s->data.name,e.name); s->data.score=e.score;
s->next=p->next; p->next=s;
return True;
}
BOOL ListDelete(LinkList &L,int i,ElemType &e){
回 True,并用 e 返回该元素值,失败返回 False
LinkList q,p=L;
int j=0;
while(p->next && j<i-1){
p=p->next;
++j;
}
if(!(p->next) || j>i-1) return False;
q=p->next; p->next=q->next;
e.sn=q->data.sn; strcpy(e.name,q->data.name); e.score=q->data.score;
free(q);
return True;}
BOOL ListFind_keyword(LinkList L,ElemType e,int &i){
False
i=1;
LinkList p=L->next;
ElemType a=p->data;
while(p && !(CompareElemType(a,e))){
到链表尾为止
p=p->next;
i++;
}
if(!p || !(CompareElemType(a,e))) return False;
else return True;
}
BOOL ListFind_loc(LinkList L,int i,ElemType &e){
True,并用 e 返回该元素值,失败返回 False
LinkList p=L->next;
int j=1;
while(p && j<i) {
p=p->next; ++j;
}
if(!p || j>i) return False;
e.sn=p->data.sn; strcpy(e.name,p->data.name); e.score=p->data.score;
得第 i 个元素值
return True;
}
void ListPrint(LinkList L) {
LinkList q=L->next;
printf("链表所有元素:\n");
while(q){
printf(" 学号: %10d 姓 名 : %13s 分
数:%10.2f\n",q->data.sn,q->data.name,q->data.score);
q=q->next;
}
printf("\n");
}
void DestroyLink(LinkList &L){
LinkList q;
while (L){q=L->next;
free(L);
L=q;
}
printf("链表已经销毁\n");
}
int CompareElemType(ElemType a,ElemType b){
if(a.sn==b.sn && a.score==b.score && strcmp(a.name,b.name)==0) return 1;
else return 0;
}
4. 主函数:
#include "link.h"
void main(){
LinkList L;
BOOL temp;
int num,loc,flag=1;
char j;
Stu stu;
printf("本程序实现链式结构的线性表操作: 插入,删除,定位,查找等\n");
printf("请输入初始链表长度:");
scanf("%d",&num);
CreatList(L,num);
ListPrint(L);
while(flag) {
printf("请选择:\n");
printf("1.显示所有学生记录\n");
printf("2.插入一个学生记录\n");
printf("3.删除一个学生记录\n");
printf("4.按关键字查找对应的学生记录\n");
printf("5.按结点序号查找学生记录\n");
printf("6.退出程序 \n");
scanf(" %c",&j);
switch(j){
case '1':
ListPrint(L);
break;
case '2':
printf("请插入位置和输入元素(学生记录):\n");
printf("格式: 位置 学号 姓名 分数;例如:3,1001,张三,95.5\n");
scanf("%d %d %s %f",&loc,&stu.sn,&stu.name,&stu.score);
temp=ListInsert(L,loc,stu);
else printf("插入成功!\n");
ListPrint(L);
break;
case '3':
printf("请输入要删除元素的结点位置:");
scanf("%d",&loc);
temp=ListDelete(L,loc,stu);
if(temp==False) printf("删除失败!\n");
else printf("成功删除了一个元素:%d,%s,%.2f\n",stu.sn,stu.name,stu.score);
ListPrint(L);
break;
case '4':
if(L->next==NULL) printf("链表为空!\n");
else{
printf("请输入查找元素(学号 姓名 分数):");
scanf("%d %s %f",&stu.sn,&stu.name,&stu.score);
temp=ListFind_keyword(L,stu,loc);
if(temp==False) printf("没有找到该元素!\n");
else printf("该元素在链表的第%d 个结点\n",loc);
}
break;
case '5':
if(L->next==NULL) printf("链表为空!\n");
else{
printf("请输入查找位置:");
scanf("%d",&loc);
temp=ListFind_loc(L,loc,stu);
if(temp==False) printf("该位置不存在!\n");
else printf("第%d 个元素是:%d %s %.2f\n",loc,stu.sn,stu.name,stu.score);
}
break;
default:
flag=0;
DestroyLink(L);
printf("程序结束,按任意键退出!\n");
}
}
getch();
}
栈的实现
#define MAX_STACK_SIZE 100
typedef int ElemType ;
typedef struct sqstack
{
ElemType stack_array[MAX_STACK_SIZE] ;
int base;
int top;
}SqStack ;(2)链栈的存储结构设计
typedef struct Stack_Node
{
ElemType data;
struct Stack_Node *next;
}Stack_Node , *Link_SN;
(3)顺序栈的操作算法设计
Status Init_Stack(SqStack &S)
{
S.base=S.top=0 ;
return OK;
}
Status push(SqStack &S , ElemType e)
{
if(S.top>=MAX_STACK_SIZE) return ERROR;
S.stack_array[S.top]=e ;
S.top++ ;
return OK;
}
Status pop( SqStack &S, ElemType &e )
{
if(S.top==0) return ERROR ;
e=S.stack_array[--S.top];
return OK;
}
(4)链栈的操作算法设计
Status Init_LinkStack(Link_SN &top)
{
top=(Link_SN)malloc(sizeof(Stack_Node ));
if(!top) exit(OVERFLOW);
top->next=NULL;
return OK;
}
{
Stack_Node *p = (Stack_Node *)malloc(sizeof(Stack_Node)) ;
if (!p) exit(OVERFLOW);
p->data=e ;
p->next=top;
top=p;
return OK;
}
char Pop_LinkStack(Link_SN &top)
{
char e;
Link_SN p;
if(top->next==NULL) return ERROR;
p=top;
e=top->data;
top=top->next;
free(p);
return e;
}
树的实现
#define MAX_STACK_SIZE 100
{
if(S.top>=MAX_STACK_SIZE) return ERROR;
S.stack_array[S.top]=e ;
S.top++ ;
return OK;
}
Status pop( SqStack &S, ElemType &e )
{
if(S.top==0) return ERROR ;
e=S.stack_array[--S.top];
return OK;
}
(4)链栈的操作算法设计
Status Init_LinkStack(Link_SN &top)
{
top=(Link_SN)malloc(sizeof(Stack_Node ));
if(!top) exit(OVERFLOW);
top->next=NULL;
return OK;
}
{
Stack_Node *p = (Stack_Node *)malloc(sizeof(Stack_Node)) ;
if (!p) exit(OVERFLOW);
p->data=e ;
p->next=top;
top=p;
return OK;
}
char Pop_LinkStack(Link_SN &top)
{
char e;
Link_SN p;
if(top->next==NULL) return ERROR;
p=top;
e=top->data;
top=top->next;
free(p);
return e;
}
图
BOOL visited[MAX_VERTEX_NUM];
void CreateGraph(Graph &G)
{
int i;
int start,end;
ArcNode *s;
for(i=1;i<=G.vexnum;i++) G.AdjList[i]=NULL;
printf("输入各边的两个顶点(有向图输入格式:弧尾,弧头):\n");
for(i=1;i<=G.arcnum;i++)
{
scanf("%d,%d",&start,&end);
s=(ArcNode *)malloc(sizeof(ArcNode));
s->nextarc=G.AdjList[start];
G.AdjList[start]=s;
if(G.GraphKind==0)
{
s=(ArcNode *)malloc(sizeof(ArcNode));
s->nextarc=G.AdjList[end];
s->adjvex=start;
G.AdjList[end]=s;
}
}
}
void DFSTraverse(Graph G)
{
int i;
printf("深度优先搜索遍历序列:");
for(i=1;i<=G.vexnum;i++) visited[i]=False;
for(i=1;i<=G.vexnum;i++)
{
if(!visited[i]) DFS(G,i);
}
printf("\b\b \n");
}
void DFS(Graph G,int i)
{
int w;
visited[i]=True;
printf("%d->",i);
for(w=FirstAdjVex(G,i);w;w=NextAdjVex(G,i,w))
{
if(!visited[w]) DFS(G,w);
}
}
void BFSTraverse(Graph G)
组 visited
{
int i,u,w;
SqQueue Q;
printf("广度优先搜索遍历序列:");
for(i=1;i<=G.vexnum;i++) visited[i]=False;
InitQueue(Q);
{
if(!visited[i])
{
visited[i]=True;
printf("%d->",i);
EnQueue(Q,i);
while(QueueLength(Q)>0)
{
DeQueue(Q,u);
for(w=FirstAdjVex(G,u);w;w=NextAdjVex(G,u,w))
{
if(!visited[w])
{
visited[w]=True;
printf("%d->",w);
EnQueue(Q,w);
}
}
}
}
}
printf("\b\b \n");
}