数据结构初级

第一章:线性表
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);
	}

二叉树
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值