数据结构最最基础的程序

数据结构的作业,暂时先把代码放着,有时间再写注释,嗯,有时间再说,感觉养成了不好的习惯。。。。。。。。代码中有好多不合理的地方,希望有心人士能够指出来,毕竟我还只是一个半吊子的码农。

顺序表

基本操作

定义线性表
typedef struct{
	listdata data[maxsize-1];
	int len;
}seqlist;
建立空表
seqlist SETNULL(){
	seqlist l;
	l.len = 0;
	return l;
}
求表长度
int Length(seqlist l){
	printf("该表的长度为:%d\n",l.len);
	return l.len;
}
按序号取出元素
listdata Get(seqlist l,int n){
	//判断是否超出表的范围 
	if(n <= 0||n > l.len){
		printf("该位置超出列表长度\n");
		return 0;
	}
	else{
		printf("第%d个元素是:%d\n",n,l.data[n-1]);
		return l.data[n-1];
	}
}
按值查询
int Locate(seqlist l,listdata x){
	int i,k=1;
	//判断是否存在,存在返回所在位置,否则返回0 
	for(i = 0;i <= l.len-1;i++)
		if(x==l.data[i]){
			printf("%d第一次出现在第%d个位置上。\n",x,i+1); 
			return i+1;
			k=0;
		} 
	if(k!=0)
		printf("该值不存在\n");		
	return 0; 
}
将新结点x插入到顺序表的第i个位置上
int insert(seqlist *l,int n,listdata x)
{int j; 
 if (l->len >= maxsize-1) //判断表空间是否溢出?
  {printf("表空间已满或溢出\n"); return 0;}
 else
  if((n < 1)||(n > l->len+1)) //判断插入位置合法否?
  	{printf("表中该位置不存在\n"); return 0;}
  else{
  	for(j = l->len-1;j >= n-1;j--) //批量移动
       l->data[j+1] = l->data[j]; //后移一个位置
   	l->data[n-1] = x; //在第i个位置上插入x,所对应的下标为n-1
   	l->len++;   
  }  
  return 1;   
}
从顺序表l中删除第i个位置上的结点
int delete(seqlist *l ,int n)
{int j;
 if((n < 1)||(n > l->len)) //判断删除位置n是否合法?
  {printf("表中该位置不存在\n"); return 0;}//非法位置返回0 
 else
  {for(j = n;j <= l->len;j++) //从第n+1至len-1 
      l->data[j-1] = l->data[j];//顺序前移一个位置
   l->len--; //表长减1
   }
 return 1; 
 }
给空表赋值
seqlist giveValue(seqlist l){
 	int i=0,j=1;
 	printf("请输入该表的整数值,回车后按Ctrl+Z结束输入:\n"); 
 	while(scanf("%d",&i) != EOF)//存储顺序表的元素 
    {	printf("第%d个数是:%d\n",j,i); 
        l.data[l.len] = i;
        l.len++;
        j++;
    }
    printf("输入完毕!!!\n"); 
    return l;
 }
检查A是不是B的子集
bool Check01(seqlist A, seqlist B){//检查A是不是B的子集 
 	int i,k;
 	bool f=true;
 	for(i=0;i<=A.len-1;i++){	//从第一个遍历到最后一个 
 		if(f){		//如果前一个值是,则判断下一个值,否则结束 
		 	for(k=0;k<=B.len-1;k++){
			if(A.data[i]==B.data[k]){
				f=true;
				break;
			}
			else
				f=false;
		 	}
		 }
	 	else
	 		return f;
	 }
	return f;
 }
合并两个子序列
seqlist packList(seqlist A,seqlist B){//合并两个子序列 
	seqlist C=B;
	printf("C表的长度为%d\n",C.len);
	int i,low=0,high,mid,k=0,n;		
	for(i=0;i<=A.len-1;i++){	//对A的每个子元素进行遍历 
		high = C.len-1;
		mid=ceil((low+high)/2.0);
		while(low<high&&C.data[mid] != A.data[i]){	//如果C的中间值不等于A中元素值 
			if(A.data[i]>C.data[mid]){ //A的元素值大于C的中间值 
				if(A.data[i]>=C.data[high]){//并且大于C中的最大值 
					k = C.len+1;
					break;
				}
				else{
					if(low == mid){	//如果low和mid相等,则返回 
						k = mid + 1;
						break; 
					}
					else{//如果low和mid不相等,则继续向右查找 
						low = mid;
					}
				}
			}	
			else if(A.data[i]<C.data[mid]){ // A的元素值小于C的中间值 
				if(A.data[i]<=C.data[low]){  //并且小于C中的最小值 
					k = low+1;
					break; 
				}
				else
					if(mid == high){//如果lhigh和mid相等,则返回 
						k = high+1;
						break;
					}
					else{ //如果high和mid不相等,则继续向左查找 
						high = mid;
					}
			} 
			//承接上面的if,没有出现过这种情况 ,这句代码相当于多余的。 
			else	
				k = mid+1;
			mid=ceil((low+high)/2.0); 
		}
		//执行完循环,如果C的中间值等于A的元素,则把A元素放到C中间值的位置上 
		if(A.data[i]==C.data[mid])
			k = mid+1; 
		//用n来接受是否成功插入元素 
		n = insert(&C,k,A.data[i]);
	}
	return C;
}

链式表

基本操作

定义链表
typedef struct node{	//定义链表 
	datatype data;
	struct node *next;
}linklist;
头插法创建链表
linklist* Create(void){
	//建立两个链表,一个用于存放数据,一个存放另一个链表的地址 
	linklist *l,*head;
	datatype ch;
	//首先建立空指针 
	head = NULL;  
	printf("请输入链表的值,以$结束\n"); 
	ch = getchar();
	while(ch != '\n'){
		// 建立一个空表大约有5字节空间(字符数据占1字节,指针占4字节),分配空间 
		l = (linklist *)malloc(sizeof(linklist)); 
		//向空间中存字符数据 
		l->data = ch;
		//向链表存放上一个节点的地址。 
		l->next = head;
		//存取当前链表地址 
		head = l;
		printf("%c",l->data);
		ch = getchar();
	}	
	return head;
}
尾插法创建链表
linklist* Creatlistr(void){
	datatype ch;
	linklist *head,*l,*r;
	//建立一个表头 
	head = (linklist*)malloc(sizeof(linklist));
	//建立一个指向下一节点的指针 
	r = head;
	printf("请输入链表的值\n"); 
	ch = getchar();
	while(ch !='\n'){
		//创建节点,分配空间 
		l = (linklist*)malloc(sizeof(linklist));
		//节点赋值 
		l->data = ch;
		//将l节点加入到链表的下一个 
		r->next = l;
		//最后一个指向l节点 
		r = l;
		//printf("%c\n",l->data);
		//获取下一节点的值 
		ch = getchar();	
	}
	r->next = NULL;
	return head->next;
}
求链表中有多少个节点
void Length(linklist *l){
	int j = 0;
	linklist *p;
	p = l;
	//链表有一个头指针,当链表是空的时候到达尾部 
	while(p != NULL){
		p = p->next;
		j++;
	}
	printf("现在链表长度是%d\n",j);
}
找前趋节点
linklist* get(linklist *l,int i){
 	if(i ==0)
 		i = 1;
 	linklist *p;
 	p = l;
 	int j = 1;
 	while((p != NULL)&&(j<i)){
	 	p = p->next;
	 	j++;
	 }
	 if(j == i){
 		return p;
 	}
 	else
 		return NULL;
 } 
按序号取元素
datatype Get(linklist *l,int i){
	int j = 1;
	linklist *p;
	p = (linklist*)malloc(sizeof(linklist));
	p = l;
	while((p->next != NULL)&&(j<i)){
		p = p->next;
		j++;
	}
	//如果存在返回值 
	if(i == j)
		return p->data;
	else
		return '$';
} 
按值查询
int Locate(linklist *l,datatype ch){
	int i = 1;
	linklist *p;
	p = (linklist*)malloc(sizeof(linklist));
	p = l;
	while(p!=NULL){
		if(p->data == ch)
			return i;
		p = p->next;
	    i++;
	}
	//如果存在返回节点的值 
	if(p->data == ch)
		return  i;
	else
		return 0;
} 
后插操作
int insertafter(linklist *l,int i,datatype x){
	//把要插入的值给新节点 
	linklist *s,*p;
	//获得第i个节点的地址 
	p = get(l,i+1);
	//给新节点分配空间,返回空间地址 
	s = (linklist*)malloc(sizeof(linklist));
	if(p != NULL){
		s->data = x;
		//将新节点链接到第i后面的节点中 
		s->next = l->next;
		//将前面的节点到新节点的节点连接 
		l->next = s;
		return 1;		
	}
	else
		return 0;
} 
前插操作
int insertbefore(linklist *l,int i,datatype x){
	linklist *s,*p;
	//给新节点分配空间,返回空间地址 
	s = (linklist*)malloc(sizeof(linklist));
	//获得第i个节点的前趋节点 
	p = get(l,i);
	if(p != NULL){
		//将第i个节点数据给新节点 
		s->data = p->data;
		//将新节点与第i后面的节点相连 
		s->next = p->next;
		//将第i个节点赋值为新值
		p->data = x;
		//链接新节点 
		p->next = s;
		return 1; 		 
	}
	else
		return 0;
} 
删除第i个节点
int Delete(linklist *l,int i){
	//找到第i个节点
	linklist *p,*s;
//	if(i==1)
//		p = get(l,i);
//	else
	p = get(l,i-1);
	if(p!=NULL){
		s = p->next;
		p->next = p->next->next;
		free(s);
		return 1;
	}
	else
		return 0;
}
输出链表
void display(linklist *l){
	linklist *p;
	int i = 1;
	p = l;
	while(p){
		printf("第%d个节点元素是%c\n",i,p->data);
		i++;
		p = p->next;
	}
} 

基本操作

定义栈
typedef struct
{	datatype data[MAXSIZE];
	int top;	
}seqstack;
初始化操作,设置空栈
int InitStack(seqstack *s){
	s->top = 0;
	return 1;
}
判断空栈操作,返回0是空,1是非空
int EmptyStack(seqstack *s){
	if(s->top>0)
		return 1;
	else
		return 0; 
}
入栈操作
int Push(seqstack *s,datatype x){
	if(s->top>=MAXSIZE){
		printf("OVERFLOE\n");
		return 0;
	}
	else{
		s->data[s->top] = x;
		s->top++;
		return 1;
	}
}
出栈操作
int Pop(seqstack *s,datatype *d){
	if(EmptyStack(s)){
		s->top--;
		*d = s->data[s->top];
		return 1;
	}
	else{
		printf("EMPTY\n");
		return 0;
	}
}
取栈顶元素操作
int GetTop(seqstack *s,datatype *d){	
	if(EmptyStack(s)){
		s->top--;
		*d = s->data[s->top];
		return 1;
	}
	else{
		printf("This stack is Empty");
		return 0;
	}
} 
置栈空操作
int ClearStack(seqstack *s){
	if(EmptyStack(s)){
		printf("This is not Empty,do you want clear\n");
		printf("Y or N\n");
		//getchar();
		int order;
		while((order=getchar())!= EOF){
			if(order='Y'){
				InitStack(s);
				return 1;
			}
			else
				return 0;	
		}	
	}
	else{
		printf("This is Empty\n");
		return 1;
	}
}
求当前栈中元素的个数
int CurrentSize(seqstack *s){
	return s->top;
}

链表栈

基本操作

定义节点
typedef struct node{
	datatype data;
	struct node *next;
}linkstack;
初始化操作
void InitStack(linkstack *top){
	top->next = NULL;
	printf("栈初始化成功\n"); 
} 
判空操作
int EmptyStack(linkstack *top){
	if(top == NULL){
		printf("this stack is empty\n");
		return 0;
	}
	else{
		printf("this stack is not empty\n");
		return 1;
	}
} 
入栈操作
int Push(linkstack *top,datatype ch_in,linkstack *node_in){
	if(node_in != NULL){
		node_in->data = ch_in;
		node_in->next = top->next;
		top->next = node_in;
		printf("%c入栈成功\n",ch_in);
		return 1;
	}
	else{
		printf("入栈失败\n");
		return 0;
	}
}
出栈操作
int Pop(linkstack *top){
	datatype ch_out;
	if(EmptyStack(top)){
		ch_out = top->next->data;
		top->next = top->next->next;
		printf("出栈成功,出栈元素为%c\n",ch_out);
		return 1;
	}
	else
	{
		printf("出栈失败\n"); 
		return 0;
	}
} 
取栈顶元素
int GetTop(linkstack *top){
	datatype ch_btn;
	if(EmptyStack(top)){
		ch_top = top->next->data;
		printf("取栈顶元素成功,栈顶元素为%c\n",ch_top);
		return 1;
	}
	else
	{
		printf("没有栈顶元素\n"); 
		return 0;
	}
}
置栈空操作
int ClearStack(linkstack *top){
	if(top != NULL){
		char ch;
		printf("this stack is not empty,dou you want to clear?(Y or N)\n");
		while(scanf("%c",&ch) != EOF){
			if(ch == 'Y'){
				top->next = NULL;
				printf("this stack is empty\n");
				return 1;
			}
			else if(ch == 'N'){
				printf("栈置空失败\n");
				return 0;
			}
			else{
				printf("输入格式错误\n"); 
			}
		}
	}
	else{
		printf("this stack is empty\n");
		return 1;
	}
} 
求当前栈中元素的个数
int CurrentSize(linkstack *top){
	int len = 0;
	linkstack *down = (linkstack *)malloc(sizeof(linkstack));
	down = top;
	while(down->next != NULL){
		len++;
		down->next = down->next->next;
	} 
	return len;
} 

两个栈共享一个空间

基本操作

定义
datatype v[M];

int ta,tb;
int flag = 0;	//入a栈flag=0,入b栈flag=1 
初始化栈
void InitStack(){
	ta = -1;
	tb = M; 
}
判栈空
int EmptyStack(datatype	*v){
	if(((tb-ta)>=0)&&((tb-ta)<=M)){
		printf("非空\n");
		return 1;
	}
	else{
		printf("空栈\n");
		return 0; 
	}
}
入栈操作
int Push(datatype *v,datatype data_in){
	if((tb-ta>1)){
		if(flag){
			tb--;	
			v[tb] = data_in;
			printf("%c入B栈成功\n",data_in); 
		}
		else{
			ta++;
			v[ta] = data_in;
			printf("%c入A栈成功\n",data_in); 
		}		
		return 1;
	}
	else{
		printf("OVERFLOW\n");
		return 0;
	} 
} 
出栈操作
int Pop(datatype *v,datatype *data_out){
	if(EmptyStack(v)){
		if(flag){
			*data_out = v[tb];
			tb++;
		}
		else{
			*data_out = v[ta];
			ta--;
		}
		return 1;
	}
	else{
		printf("出栈失败\n");
		return 0;
	}
}
取栈顶元素
int GetTop(datatype	*v,datatype	*data_top){
	if(EmptyStack(v)){
		if(flag){	
			*data_top = v[tb];
		}
		else{
			*data_top = v[ta];
		}
		return 1;
	}
	else{
		printf("取栈顶元素失败\n"); 
		return 0;
	}
}
取栈底元素
int GetBottom(datatype *v,datatype *data_btm){
	if(EmptyStack(v)){
		if(flag){	
			*data_btm = v[M-1];
			int i = M-1; 
			for(i;i<=tb;i--)
				v[i] = v[i-1];
		}
		else{
			*data_btm = v[0];
			int i = 0;
			for(i;i>=tb;i++)
				v[i] = v[i+1];
		}
		return 1;
	}
	else{
		printf("取栈底元素失败\n");
		return 0;
	}
} 

循环列表

基本操作

定义列表
typedef struct{
	datatype data[M];
	int front,rear;
}sequeue;
置空队列
void SETNULL(sequeue *sq){
	sq->front = 0;
	sq->rear = 0;
	printf("现在队列已经置空"); 
} 
判空
int EMPTY(sequeue *sq){
	if(sq->front == sq->rear){
		printf("this squeue is Empty\n");
		return 0;
	}
	else{
		printf("this squeue is not Empty\n");
		return 1;
	}
}
取队列头,元素不动
int FRONT(sequeue *sq){
	if(EMPTY(sq)){
		printf("队列头元素为%c\n",sq->data[(sq->front%M)]);
		return 1;
	}
	else{
		printf("队列中没有元素\n");
		return 0;
	}
} 
将元素放到队列尾部
int ENQUEUE(sequeue *sq,datatype data_in){
	if(((sq->rear+1)%M) == sq->front){
		printf("这个队列已经满了\n");
		return 0;
	}
	else{
		sq->data[sq->rear] = data_in;
		printf("%c元素在%d位置上添加成功\n",data_in,sq->rear);
		sq->rear = (sq->rear)%M+1;
		return 1;
	}	
}
出队
int DEQUEUE(sequeue *sq){
	datatype data_out;
	if(EMPTY(sq)){
		data_out = sq->data[sq->front%M];
		printf("出队元素为%c\n",data_out);
		sq->front = sq->front%M+1;
		return 1;
	}
	else{
		printf("队列中没有元素,出队失败\n");
		return 0;
	}
}

链表队列

基本操作

定义
typedef struct node{
	datatype data;
	struct node *next;
}linknode;
typedef struct{
	linknode *front,*rear;
}linksqueue;
置空队列
void SETNULL(linksqueue *sq){
	sq->front =  (linknode *)malloc(sizeof(linknode));
	sq->rear = (linknode *)malloc(sizeof(linknode));
	sq->front->next = NULL;
	sq->rear = sq->front;
	printf("初始化成功\n");
} 
判空
int EMPTY(linksqueue *sq){
	if(sq->front==sq->rear){
		printf("this linkqueue is Empty\n");
		return 0;
	}
	else{
		printf("this linkqueue is not Empty\n");
		return 1;
	}
}
取队列头,元素不动
int FRONT(linksqueue *sq){
	datatype data_get;
	if(EMPTY(sq)){
		data_get = sq->front->next->data;
		printf("获得队列头元素为%c\n",data_get);
		return 1;
	}
	else{
		printf("取队列头元素失败\n");
		return 0;
	} 
} 
将元素放到队列尾部
int ENQUEUE(linksqueue *sq,datatype data_in){
	linknode *n = (linknode *)malloc(sizeof(linknode));
	if(n != NULL){
		n->data = data_in;
		sq->rear->next = n;
		sq->rear = n;
		printf("%c元素入队成功\n",data_in);
		return 1;
	}
	else{
		printf("OVERFLOW\n");
		return 0;
	}
	
}
出队
int DEQUEUE(linksqueue *sq){
	linknode *n = (linknode *)malloc(sizeof(linknode));
	if(EMPTY(sq)){
		n = sq->front->next;
		printf("出队元素%c\n",n->data);
		sq->front->next = sq->front->next->next;
		return 1;
	}
	else{
		printf("出队失败\n");
		return 0;
	}
}
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值