第一章:线性表
1.线性表的顺序存储
//请自行完成第一部分内容:头文件包含和常量定义
#define MAXSIZE 100
#define OK 1
#define ERROR 0
//请自行完成第二部分内容:先用typedef确定元素类型
//然后是结构体定义,务必注意最后要有分号
typedef int ElemType;
typedef struct
{
ElemType elem[MAXSIZE];
int last;
}SeqList;
//第三部分,自定义函数
int Locate(SeqList L,ElemType e)
{
int i=0; //i为扫描计数器,初值为0,即从第一个元素开始比较
while((i<=L.last)&&(L.elem[i]!=e)) //顺序扫描表,直到找到值为key的元素
i++;
if(i<=L.last)
return(i+1); //若找到值为e的元素,则返回其序号
else
return(-1); //若没找到,则返回空序号
}
int InsList(SeqList *L,int i,ElemType e)
{
int k;
if((i<1)||(i>L->last+2))//首先判断插入位置是否合法
{
printf("插入位置i值不合法");
return(ERROR);
}
if(L->last>=MAXSIZE-1)
{
printf("表已满无法插入");
return(ERROR);
}
for(k=L->last;k>=i-1;k--) //为插入元素而移动位置
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e; //在C语言数组中,第i个元素的下标为i-1
L->last++;
return(OK);
int DelList(SeqList *L,int i,ElemType *e)
//在顺序表L中删除第i个数据元素,并用指针参数e返回值。i的合法取值为1
{
int k;
if((i<1)||(i>L->last+1))
{
printf("删除位置不合法!");
return(ERROR);
}
}
*e=L->elem[i-1]; //将删除的元素存放到e所指向的变量中
for(k=i;k<=L->last;k++)
L->elem[k-1]=L->elem[k];
L->last--;
return(OK);
}
void Print(SeqList *L)
{
int i;
printf("表中元素为:");
for(i=0;i<=L->last;i++)
printf("%-6d%",L->elem[i]);
printf("\n");
}
//第四部分,main函数
void main()
{
SeqList H;
int x;
H.last=-1;
InsList(&H,1,12);
InsList(&H,2,5);
InsList(&H,3,29);
Print(&H);
DelList(&H,2,&x);
Print(&H);
x=Locate(H,12);
if(x==-1)
printf("未找到");
else
printf("是第%d个元素",x);
}
2.线性表的链式存储单链表
/*请自行完成第一部分内容:头文件包含和常量定义*/
#include<stdio.h>
#define OK 1
#define ERROR 0
/*请自行完成第二部分内容:先用typedef确定元素类型,*/
/*然后是结构体定义,务必注意最后要有分号。*/
typedef char ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}Node,*LinkList;
/*第三部分,自定义函数*/
void InitList(LinkList *L)/*对单链表进行初始化*/
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
void CreateFromTail(LinkList L)
{
Node *r, *s;
char c;
int flag =1; /*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/
r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL; /*将最后一个结点的next链域置为空,表示链表的结束*/
}
}
}
Node * Get (LinkList L, int i)
/*在带头结点的单链表L中查找第i个结点,若找到(1≤i≤n),则返回该结点的存储位置; 否则返回NULL*/
{
int j;
Node *p;
p=L;
j=0; /*从头结点开始扫描*/
while ((p->next!=NULL)&&(j<i))
{
p=p->next; /* 扫描下一结点*/
j++; /* 已扫描结点计数器 */
}
if(i == j)
return p; /* 找到了第i个结点 */
else
return NULL; /* 找不到,i≤0或i>n */
}
int ListLength(LinkList L)
/*求带头结点的单链表L的长度*/
{
Node *p;
int j;
p=L->next;
j=0; /*用来存放单链表的长度*/
while(p!=NULL)
{
p=p->next;
j++;
}
return j; /*j为求得的单链表长度*/
}
int InsList(LinkList L,int i,ElemType e)
/*在带头结点的单链表L中第i个位置插入值为e的新结点s*/
{
Node *pre,*s;
int k;
pre=L;
k=0; /*从"头"开始,查找第i-1个结点*/
while(pre!=NULL&&k<i-1) /*表未查完且未查到第i-1个时重复,找到pre指向第i-1个*/
{
pre=pre->next;
k=k+1;
} /*查找第i-1结点*/
if(!pre) /*如当前位置pre为空表已找完还未数到第i个,说明插入位置不合理*/
{
printf("插入位置不合理!");
return ERROR;
}
s=(Node*)malloc(sizeof(Node)); /*申请一个新的结点S */
s->data=e; /*值e置入s的数据域*/
s->next=pre->next; /*修改指针,完成插入操作*/
pre->next=s;
return OK;
}
int DelList(LinkList L,int i,ElemType *e)
/*在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量*e中*/
{
Node *pre,*r;
int k;
pre=L;
k=0;
while(pre->next!=NULL && k<i-1) /*寻找被删除结点i的前驱结点i-1使p指向它*/
{
pre=pre->next;
k=k+1;
} /*查找第i-1个结点*/
if(!(pre->next)) /* 即while循环是因为p->next=NULL或i<1而跳出的,而是因为没有找到合法的前驱位置,说明删除位置i不合法。*/
{
printf("删除结点的位置i不合理!");
return ERROR;
}
r=pre->next;
pre->next=pre->next->next; /*修改指针,删除结点r*/
*e = r->data;
return OK;
}
void Print(LinkList L)
{
Node* p;
printf("表中元素为:");
p = L->next;
while (p != NULL)
{
printf("%4c", p->data);
p = p->next;
}
printf("\n");
}
/*第四部分,main函数*/
void main()
{
LinkList H, p;
int i; char c;
InitList(&H);
printf("请输入单链表元素值,以$结束!\n");
CreateFromTail(H); Print(H);
printf("长度为%d\n", ListLength(H));
InsList(H, 2, 'n'); InsList(H, 2, 'p'); Print(H);
printf("长度为%d\n", ListLength(H));
DelList(H, 1, &c); Print(H);
printf("长度为%d\n", ListLength(H));
printf("请输入要查找的结点序号:\n"); scanf("%d", &i);
p = Get(H, i);
if (p != NULL)
printf("第%d个结点的值为:%c\n", i, p->data);
else
printf("未找到此结点!\n");
}
第二章:限定性线性表—栈与队列
2.1栈
3.顺序栈
#include<stdio.h>
/*第一部分,自定义*/
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
typedef char StackElementType;
typedef struct
{
StackElementType elem[Stack_Size];
int top;
}SeqStack;
/*第二部分,函数*/
/*初始化*/
void InitStack(SeqStack *S)
{
/*构造一个空栈S*/
S->top=-1;
}
/*判栈空*/
int IsEmpty(SeqStack *S) /*判断栈S为空栈时返回值为真,反之为假*/
{
return(S->top==-1?TRUE:FALSE);
}
/*判栈满*/
int IsFull(SeqStack *S) /*判断栈S为满栈时返回值为真,反之为假*/
{
return(S->top==Stack_Size-1?TRUE:FALSE);
}
/*进栈*/
/*出栈*/
/*读栈*/
/*主函数*/
void main()
{
SeqStack N;char c;
InitStack(&H);
Push(&H,'A');
Push(&H,'B');
Push(&H,'C');
printf("入栈序列为ABC,出栈序列为:");
Pop(&H,&c);printf("%c",c);
Pop(&H,&c);printf("%c",c);
Pop(&H,&c);printf("%c",c);
}
4.链栈
#include<stdio.h>
#include<malloc.h> //动态存储分配函数
#define TRUE 1
#define FALSE 0
//第二部分:结构体
typedef char StackElementType;
typedef struct node
{
StackElementType data;
struct node *next;
}LinkStackNode;
typedef LinkStackNode *LinkStack;
//第三部分:函数
/*进栈操作。*/
int Push(LinkStack top, StackElementType x)/* 将数据元素x压入栈top中 */
{
LinkStackNode *temp;
temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));
if(temp==NULL)
return(FALSE); /* 申请空间失败 */
temp->data=x;
temp->next=top->next;
top->next=temp; /* 修改当前栈顶指针 */
return(TRUE);
}
/*出栈操作。*/
int Pop(LinkStack top, StackElementType *x)
{
/* 将栈top的栈顶元素弹出,放到x所指的存储空间中 */
LinkStackNode * temp;
temp=top->next;
if(temp==NULL) /*栈为空*/
return(FALSE);
top->next=temp->next;
*x=temp->data;
free(temp); /* 释放存储空间 */
return(TRUE);
}
//第四部分:主函数
void main()
{
LinkStack H;char c;
H=malloc(sizeof(LinkStackNode));
H->next=NULL;
Push(H,'G');
Push(H,'D');
Push(H,'S');
printf("入栈顺序为G D S,出栈顺序为: ");
Pop(H,&c);
printf("%c",c);
Pop(H,&c);
printf("%c",c);
Pop(H,&c);
printf("%c",c);
}
2.2队列
5.链队列
#include<stdio.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50 /*队列的最大长度*/
//第二部分:结构体
typedef char QueueElementType;
typedef struct Node
{
QueueElementType data;
struct Node *next;
}LinkQueueNode;
typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;
//第三部分:函数
/*初始化操作。*/
int InitQueue(LinkQueue *Q)
{
/* 将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,QueueElementType x)
{
/* 将数据元素x插入到队列Q中 */
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,QueueElementType *x)
{
/* 将队列Q的队头元素出队,并存放到x所指的存储空间中 */
LinkQueueNode * p;
if(Q->front==Q->rear)
return(FALSE);
p=Q->front->next;
Q->front->next=p->next; /* 队头元素p出队 */
if(Q->rear==p) /* 如果队中只有一个元素p,则p出队后成为空队 */
Q->rear=Q->front;
*x=p->data;
free(p); /* 释放存储空间 */
return(TRUE);
}
//第四部分:主函数
void main()
{
LinkQueue H;
char c;
InitQueue(&H);
EnterQueue(&H,'S');
EnterQueue(&H,'S');
EnterQueue(&H,'B');
printf("入队元素为SSB,出队元素为:");
DeleteQueue(&H,&c);printf("%c",c);
DeleteQueue(&H,&c);printf("%c",c);
DeleteQueue(&H,&c);printf("%c",c);
}
6.循环队列(顺序队)
#include<stdio.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50 /*队列的最大长度*/
//第二部分:结构体
typedef char QueueElementType;
typedef struct
{
QueueElementType element[MAXSIZE];
int front;
int rear;
}SeqQueue;
//第三部分:函数
/*初始化操作*/
void InitQueue(SeqQueue *Q)
{
/* 将*Q初始化为一个空的循环队列 */
Q->front=Q->rear=0;
}
/*入队操作*/
int EnterQueue(SeqQueue *Q, QueueElementType x)
{
/*将元素x入队*/
if((Q->rear+1)%MAXSIZE==Q->front) /*队列已经满了*/
return(FALSE);
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE; /* 重新设置队尾指针 */
return(TRUE); /*操作成功*/
}
/*出队操作*/
int DeleteQueue(SeqQueue *Q, QueueElementType *x)
{
/*删除队列的队头元素,用x返回其值*/
if(Q->front==Q->rear) /*队列为空*/
return(FALSE);
*x=Q->element[Q->front];
Q->front=(Q->front+1)%MAXSIZE; /*重新设置队头指针*/
return(TRUE); /*操作成功*/
}
//第四部分:主函数
void main()
{
SeqQueue H;
char c;
InitQueue(&H);
EnterQueue(&H,'S');
EnterQueue(&H,'S');
EnterQueue(&H,'B');
printf("入队元素为SSB,出队元素为:");
DeleteQueue(&H,&c);printf("%c",c);
DeleteQueue(&H,&c);printf("%c",c);
DeleteQueue(&H,&c);printf("%c",c);
}
约瑟夫问题:
/* Note:Your choice is C IDE */
#include<stdio.h>
typedef struct Node
{
int password;
int num;
struct Node *next;
}Node,*Linklist;
void main()
{
Linklist L;
Node *p,*r,*q;
int m,n,C,j;
L=(Node*)malloc(sizeof(Node));
if(L==NULL) {printf("\n链表申请不到空间!");return;}
L->next=NULL;
r=L;
printf("请输入数据n的值(n>0):");
scanf("%d",&n);
for(j=1;j<=n;j++)
{
p=(Node*)malloc(sizeof(Node));
if(p!=NULL)
{
printf("请输入第%d个人的密码:",j);
scanf("%d",&C);
p->password=C;
p->num=j;
r->next=p;
r=p;
}
}
r->next=L->next;
printf("请输入第一个报数上限值m(m>0):");
scanf("%d",&m);
printf("***************************\n");
printf("出列的顺序为:\n");
q=L;
p=L->next;
while(n!=1)
{
j=1;
while(j<m)
{
q=p;
p=p->next;
j++;
}
printf("%d->",p->num);
m=p->password;
n--;
q->next=p->next;
r=p;p=p->next;
free(r);
}
printf("%d\n",p->num);
}
二叉树