数据结构代码实例实现(王道)

王道数据结构顺序表的代码实现:

讲道理,实现才有意思。

#include<stdio.h>
#include<stdlib.h>

//静态分配 
#define MaxSize 50
typedef int ElemType;
//typedef struct{
//	ElemType data[MaxSize];
//	int length;
//}SqList;

//动态分配 
#define InitSize 100
typedef struct{
	ElemType *data;
	int length;
}SqList; 
void show(); 

bool ListInsert(SqList &L, int i, int e){ 
	//本算法实现将元素e插入到顺序表中L中第i个位置 
	int j; 
	if( i<1||i>L.length+1 ){
		printf("输入位置不合法!\n");
		return false;
	}
	if(L.length>=InitSize ) {
		printf("没有足够空间!\n");
		return false;
	}
		for( j=L.length; j>=i; j-- )
		L.data[j] = L.data[j-1];
		L.data[i-1]=e; 
		L.length++; 
		return true;
}

bool ListDelete(SqList &L, int i){
	int j;
	if( i<1|| i>L.length ){
		printf("输入位置不合法");
		return false; 
	}
	
	for( j=i; j<L.length; j++ )
		L.data[j-1]=L.data[j];
	L.length--;
	return true;
}

int LocateElem(SqList &L, int e){
	int i;
	
	for( i=0; i<=L.length; i++ )
	if( L.data[i]==e)
	return i+1;
	
	return 0;
}

void PrintList(SqList L){
	for(int i=0;i<L.length; i++ ){
		printf("%d ",L.data[i]);
	} 
	printf("\n");
}  

SqList MakeEmpty()
{  
	SqList L;   
	printf("输入连续的数字,中间空格分开,-1作为结束:");
	int i=0, n; 
	L.data = (int *)malloc(InitSize*sizeof(int));
	L.length=-1; 
	while(1){ 
		scanf("%d", &n);
		if(n==-1)  
		break;  
		L.data[i] = n;
		L.length++;
		i++;
//		printf("length=%d\n",L.length);
	} 
	L.length++;
	L.data[i] = 0;
	if(L.length>=0)
	printf("创建成功!\n");
	return L; 
}  

bool ListDeleteMin(SqList &L){  //删除最小节点 P18页综合应用题第 1 题 。  
    
    int i, t=0, k;
   if( L.length>0 ){
   	 k=L.data[0];
   	 printf("k=%d\n",k);
   	 
    for( i=1; i<L.length; i++ )
    if( k > L.data[i] ){
    	k=L.data[i];
    	t=i; 
	}  
	L.data[t]=L.data[L.length-1];//由于代码中本人特意为length多加了一个位置,所以减一。 
	
	printf("L.data[%d]=%d\n", t, L.data[t]);
	L.data[L.length-1] = 0;
	L.length--;
    return true;
   } else
   return false;
} 

void ReSqList(SqList &L){ // P18页综合应用题第 2 题 。   
	 
	int i=0, k=L.length-1, t=0;  
	
	for( i=0; i<(L.length-1)/2; i++, k-- )  
	{  
		t = L.data[i];  
        L.data[i] = L.data[k];    
        L.data[k] = t;  
	}  
}  
 
void ValueDelete(SqList &L, int e){ // P18页综合应用题第 3 题 。  
	  
	int i=0, k=0, j=0;  
	for( i=0; i<L.length-1; i++ )  
	if( e == L.data[i] ){   
		for( j=i; j<L.length; j++ )  
		  	L.data[j] = L.data[j+1]; 
		  	L.length--; 
	} 
} 

bool DeleteSqListZ(SqList &L, int e, int u){ // P18页综合应用题第 4 题 。  
	
	int i=0, t=0, j=0;  
	if( u>e ) 
	{
		for( i=e-1, j=u; j<L.length ;i++ ,j++ ,t++ ){
		L.data[i] = L.data[j]; 
	//	printf("L.data[i=%d]=%d,L.data[u=%d]=%d\n",i, L.data[i],j, L.data[j] )	;
	}  
	for(i=0; i<u-e+1; i++ )
	L.length--;
	return true;
	}
	if(u<e)
	return false;   
}    

bool ValueListDelete(SqList &L, int e, int u){ //  P18页综合应用题第 5 题 。   
	int j, K;   
	for( K=0; K<L.length; K++ )  
		if( L.data[K]>=e && L.data[K]<=u ){
			printf("L.data[K=%d]=%d\n", K, L.data[K]);    
		    for( j=K; j<L.length; j++ )   
			     L.data[j]=L.data[j+1];    
            L.length--;   
            K--;//最重要的一步,回头重新检查移位后的所有数字    
	}    
	return true;  
}   

bool Same_Delete(SqList &L){ // P18页综合应用题第 6 题 。  
	  
	if(L.length==0)  
	return false;  
	int i, j;  
	for(i=0, j=1; j<L.length; j++ )  
	if(L.data[i]!=L.data[j])  
	L.data[++i] = L.data[j];  
	L.length=i+1;  
	return true;  
}  
 
bool Merge(SqList &A, SqList &B, SqList &C) // P18页综合应用题第 7 题 。
{ 
	if(A.length+B.length>C.length) 
	return false; 
	int i=0, j=0, k=0; 
	while(i<A.length&&j<B.length){ 
	    if(A.data[i]<=B.data[j]) 
	    C.data[k++]=A.data[i++]; 
	    else 
	    C.data[k++]=B.data[j++]; 
	} 
	while(i<A.length) 
	C.data[k++] = A.data[i++]; 
	while(i<B.length) 
	C.data[k++] = B.data[j++]; 
	 
	C.length = k; 
	return true; 
} 

void Reverse(SqList &A, int left, int right, int arraySize){      // P18页综合应用题第 8 题 。(1)
	//逆转(aleft, aleft+2..., aright)为(aright,aright-1,...,aleft) 
	if(left>=right||right>=arraySize) 
	return ; 

	int mid=(left+right)/2; 
	for( int i=0; i<=mid-left; i++ ){ 
		int temp = A.data[left+i]; 
		A.data[left+i]=A.data[right-i]; 
		A.data[right-i] = temp;	 
	}	 
}  

void Exchange(SqList &A, int m, int n, int arraySize){  // P18页综合应用题第 8 题 。(2) 
	Reverse( A, 0, m+n-1, arraySize ); 
	Reverse( A, 0, n-1, arraySize ); 
	Reverse( A, n, m+n-1, arraySize ); 
} //1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -1  

void ValueExchange(SqList &A, int e){ // P18页综合应用题第 9 题 方法 1 
	if(A.length==0) 
	return ; 
	int i, j=0, t , k=0, u; 
	for( i=0; i<A.length-1; i++ ){ 
		if( A.data[i]==e ){ 
			t = A.data[i]; 
			A.data[i]=A.data[A.length-1]; 
			A.data[A.length-1] = t; 
			j=1; 
		}else if(A.data[i]>e)
			break;
		 
	} 
	if( e>A.data[A.length-1] ){
	    	A.data[A.length]=e;
	    	A.length++;
	    	return ;
		} 
	    if(j==0 ) { 
	    	for( k = A.length; k>i; k-- )
	    		A.data[k] = A.data[k-1];
		    A.data[i]=e;
		    A.length++;
		} 
}

void SearchExchangeInsert(SqList A, int e){ // P18页综合应用题第 9 题 方法 2  
	int low=0, high=A.length-2, mid, t, i;
	printf("L=%d\n", A.length-2);
	while(low<=high){
		mid = (low+high)/2;
		if(A.data[mid]==e) break;
		else if(A.data[mid]<e) low=mid+1;
		else high=mid-1;
	}  
	if(A.data[mid]==e&&mid!=A.length-2){
		t = A.data[mid];
		A.data[mid] = A.data[mid+1];
		A.data[mid+1]=t;
	} 
	if(low>high){ 
		for( i=A.length-2; i<high;i--)
		A.data[i+1]=A.data[i];
		A.data[i+1]=e;
	}
} 

int main(){  
    show(); 
    bool ret, blu; 
    int i, j ,n ,e, u, arraySize;
    SqList L, A, C, B, D, E, F, Q;  
	while(1){
		scanf("%d", &n);
		
		if(n==1) 
	    L = MakeEmpty(); 
        
        if( n==2 ){
		    printf("输入需要查找的数字:");
		    scanf("%d", &e);
			j = LocateElem(L, e);
			if(j==0)
            printf("查找失败!");
            else
            printf("查找的数字在第%d位上\n", j);
		} 
         
	    if(n==3){ 
	    printf("输入需要插入的位置和字符,中间用空格分开");
	    scanf("%d %d", &i, &e);
		ret = ListInsert(L, i, e); 
	    if(ret)printf("插入成功!\n");
		else printf("插入失败!\n"); 
		}
	    
	    if(n==4){
	    	printf("输入删除的位置:");
	    	scanf("%d", &e);
	        blu = ListDelete(L, e);
	        if(blu)printf("删除成功!\n");
		else printf("删除失败!\n"); 
	        
		}
	    
	    if(n==5){
	    	scanf("%d", &e);
	    	SearchExchangeInsert(L, e);
		}
	    
	    if(n==6) 
	    PrintList(L);
	    
		if( n==7 ){
		int a=ListDeleteMin(L);
			if(a)printf("删除最小节点成功!");
		}
		if( n==8 ){
			ReSqList(L);
		}
		
		if( n==9 ){
			printf("输入需要删除的值"); 
			scanf("%d", &e );
			ValueDelete(L, e);
		}
		 
		if(n==10){
			printf("输入需要删除的区域起始和终结位置");
		    scanf("%d %d" , &e, &u);
			ret = DeleteSqListZ(L, e, u);
			if(ret)printf("删除成功!");
		}
		
		if(n==11){
			printf("输入需要删除的值域起始和终结位置");
			scanf("%d %d" , &e, &u);
			ret = ValueListDelete(L, e, u);
			if(ret)printf("删除成功!\n");
		}
		if(n==12){
			ret=Same_Delete(L);
			if(ret) printf("删除成功!\n");
		} 
		
		if(n==13)
		{
			A = MakeEmpty();
			B = MakeEmpty();  
			C.length=A.length+B.length;
			
			for( i=0; i<=C.length; i++ )
			C.data[i]=0;
			ret = Merge( A ,B ,C );
			if(ret)printf( "合并成功!\n" );   
			else printf("合并失败!\n新的顺序表为:"); 
			PrintList(C);  
		} 
		
		if(n==14){ 
		      printf("输入数列大小!\n");
		      scanf("%d %d %d", &arraySize, &e, &u);
			  Q = MakeEmpty();
			  Exchange( Q, e, u, arraySize );
			  printf("得到的新序列为:");
			  PrintList( Q ); 
		} 
		if( n==15 ){ 
	    scanf("%d", &e); 
		ValueExchange(L, e); 
    } 
		
	} 
	system("pause");   
	
return 0;
} 

void show()
{
	printf("\n");
	printf("                       |_____________顺序表_____________|\n");   
	printf("                       |          1.输 入 数 字         |\n");   
	printf("                       |          2.查 找 数 字         |\n");   
	printf("                       |          3.插 入 数 字         |\n");   
	printf("                       |          4.删 除 数 字         |\n");   
	printf("                       |          5.二分法 查找         |\n");   
	printf("                       |          6.查 询 显 示         |\n");   
	printf("                       |          7.删除最小节点        |\n");  
	printf("                       |          8.顺序表逆转          |\n"); 
	printf("                       |          9.按值删除            |\n");  
	printf("                       |          10.按区间删除         |\n");
	printf("                       |          11.按值域删除         |\n");
	printf("                       |          12.删除相同值         |\n");
	printf("                       |          13.合并两个顺序表     |\n");	
	printf("                       |          14.置换顺序表位置     |\n");	
	printf("                       |          15.按值增加置换表     |\n");
	printf("                       |          00.退 出 系 统        |\n");
	printf("                       |________________________________|\n");
	printf("\n请选择菜单序号:"); 
}   

 

单链表

#include<stdio.h>  
#include<stdlib.h>  

typedef struct LNode{    
	int data;    
	struct LNode *next;     
}LNode, *LinkList;    

void show(); 

LinkList List_HeadInsert(LinkList &L){	//头插法   带头结点的 
	int n;                                                    
	L = (LinkList)malloc(sizeof(LNode));//创建空列表          
	LNode *s;   
	L->next = NULL;   
	scanf("%d",&n);   
	while(n!=9999){      
		s = (LNode*)malloc(sizeof(LNode));
		s->data = n;
		s->next = L->next;
		L->next = s;
		scanf("%d",&n);
	} 
	return L;
}   
    
LinkList List_TailInsert(LinkList &L){  //尾插法  
	int x; 
	L = (LinkList)malloc(sizeof(LNode));
	LNode *s, *r=L;
	scanf("%d", &x);
	while(x!=9999){ 
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d", &x);
	} 
	r->next = NULL; 
return L; 
} 

LNode *GetElem(LinkList L, int i) //根据位置找元素 
{ 
	int j=1; 
	LNode *p=L->next;//头指针赋给P 
	if(i==0) 
	return L; 
	if(i<1) 
	return NULL; 
	while(p&&j<i){ 
		p=p->next; 
		j++; 
	} 
	return p;//返回第i个结点的指针,若i大于表长则返回NULL 
} 

int LocateElem(LinkList L, int e) //数值位置找元素 
{ 
	LNode *p = L->next; 
	int i=0; 
	while(p!=NULL&&p->data!=e) 
	{ 
	 p=p->next;  i++; 
	} 
	if(p==NULL) 
	i=0; 
	return i; 
} 

void Insert(LinkList L, LNode *s, int i){  //插入元素 n=5
	LNode *p; 
    p=GetElem(L, i-1); 
	s->next = p->next; 
	p->next = s; 
/*-----------------------------------
   	temp = p->data;
	p->data = s->data;
	s->data = temp; 
   ------------------------------------- 转为后插法 */
} 

void ListDelete( LinkList L, int i ){ //删除元素   n=6
	LNode *p, *q; 
    p=GetElem(L, i-1); 
    q=p->next;
//p->data = p->next->data; //和后继结点交换数据域  
    p->next = q->next;
    free(q); 
}  

void Del_X_3(LinkList &L/*加'&'符号,用来引导地址*/, int x) // 综合题第一题,不带头结点   
{  
	LNode *p;          
	if(L==NULL)      
	return;       
	if(L->data==x){    
		p=L;        
		L=L->next;   
		free(p); 
		Del_X_3(L, x); 
	}else 
	Del_X_3(L->next, x); 
}    

void  Del_X_2(LinkList &L/*加'&'符号,用来引导地址*/, int x) //综合提第二题 ① 
{ 
	LNode *p=L->next, *pre=L, *q;
	while(p!=NULL){ 
		if(p->data==x){ 
			q=p; 
			p=p->next; 
			pre->next=p; 
			free(q);
		}else{ 
		pre=p;	 
		p=p->next;   
		}//else 
	}//while  
} 

void  Del_X_1(LinkList &L/*加'&'符号,用来引导地址*/, int x)  //综合提第二题 ② 
{ 
    LNode *p=L->next, *r=L, *q;//r指向尾指针,其初始值为头结点 
	while(p!=NULL){ 
		if(p->data!=x){ 
			r->next = p; 
			r=p; 
			p=p->next;  
		}else{   
			q=p;  
			p=p->next;  
			free(q);  
		}   
	} //while 
	r->next = NULL; 
}  

void Print(LinkList L) //综合提第三题 反向输出链表
{
	if(L->next!=NULL)    Print(L->next);
	if(L!=NULL)    printf("%d ", L->data);
} 

void Del_Min( LinkList L ) //综合题第四题 删除最小值 
{ 
	LNode *pre=L, *p=pre->next; 
	LNode *minpre = pre, *minp=p; 
	while( p!=NULL ){ 
		if( p->data < minp->data ){ 
			minp=p; 
			minpre=pre; 
		} 
		pre=p; 
		p=p->next; 
	}  
	minpre->next = minp->next; 
	free(minp); 
}  

void Reverse_1(LinkList L) //综合题第五题 ① 
{ 
	LNode *p, *r; 
	p=L->next; 
	L->next=NULL; 
	while(p!=NULL){ 
		r=p->next; 
		p->next=L->next; 
		L->next=p; 
		p=r; 
	} 
} 

void Reverse_2(LinkList L) //综合题第五题 ② 
{ 
	LNode *pre, *p=L->next, *r=p->next; 
	p->next=NULL; 
	while(r!=NULL){   
		pre=p;   
		p=r;   
		r=r->next;   
		p->next=pre;   
	}   
	L->next=p;  
}  

void Sort(LinkList L) //综合题第六题  链表排序 
{ 
	LNode *p=L->next, *pre; 
	LNode *r=p->next; 
	p->next=NULL; 
	p=r; 
	while(p!=NULL){ 
		r=p->next; 
		pre=L; 
		while(pre->next!=NULL&&pre->next->data<p->data)  
		    pre=pre->next; 
	    p->next=pre->next; 
	    pre->next=p; 
	    p=r; 
	}   
 }  

void Del_deter(LinkList &L, int a, int b ) //综合题第七题  删除值域 
{ 
	LNode *p=L->next, *pre=L; 
	while(p!=NULL){ 
		if(p->data>a&&p->data<b){  
		pre->next=p->next; 
		free(p); 
        p=pre->next; 
		}else { 
			pre=p; 
			p=p->next; 
		} 
	} 
} 

void Min_Delete(LinkList &head) //综合题第九题  
{
	LNode *pre, *p, *u;
	while(head->next!=NULL){
		pre=head;
		p=pre->next;
		while(p->next!=NULL){
			if( p->next->data < pre->next->data )
			pre=p;
			p=p->next;
		} 
		printf("%d ", pre->next->data ); 
		u=pre->next;
		pre->next=u->next;
		free(u);
	} //while
	free(head);
} 

void Div_List( LinkList &L ) 
{
	LNode *pre=L, *p=pre->next, *O, *D; 
	D = (LinkList)malloc(sizeof(LNode)); 
	O = (LinkList)malloc(sizeof(LNode)); 
	LNode *ro, *ra, *s1=D, *s2=O; 
	while( p!=NULL ){ 
		if(p->data%2==0){ 
		ro=(LNode*)malloc(sizeof(LNode)); 
	    ro->data=p->data;
	    s1->next=ro;
	    s1=ro;
		}else{ 
		ra=(LNode*)malloc(sizeof(LNode)); 
	    ra->data=p->data;
	    s2->next=ra;
	    s2=ra;
		} 
		p=p->next;
	} 
    s1->next=NULL;
	s2->next=NULL;	
	while(O->next!=NULL){ 
	    O=O->next; 
		printf("%d ",O->data);
	} 
	printf("\n");
		while(D->next!=NULL){ 
			D=D->next;
		printf("%d ",D->data);
	} 
} 

LinkList DisCreat_1(LinkList A) //综合题第十题 
{ 
	int i=0;
	LNode *B=(LinkList)malloc(sizeof(LNode)), *p; 
	B->next=NULL;
	LNode *ra=A,*rb=B;
	p=A->next;
	A->next=NULL;
	
	while(p!=NULL){
		i++;
		if(i%2==0){
			rb->next=p;
			rb=p;
		}else{
			ra->next=p;
			ra=p;
		} 
		p=p->next;
	} 
	ra->next=NULL;      
	rb->next=NULL;      
	return B;    
}   
  
LinkList DIsCreat_2(LinkList &A) //综合题第十一题  
{ 
	LinkList B=(LinkList)malloc(sizeof(LNode)); //创建B表头  
	B->next=NULL;
	LNode *p=A->next, *q;
	LNode *ra=A; 
	
	while(p!=NULL){ 
		ra->next=p; 
		ra=p; 
		p=p->next; 
		if(p!=NULL) 
		q=p->next; 
		p->next=B->next; 
		B->next=p; 
		p=q; 
	} 
	ra->next=NULL; 
	while(B!=NULL){ 
		B=B->next; 
		printf("%d ", B->data); 
	} 
	return B; 
 } 

void Del_same(LinkList L) //综合题十二题 ① 
{ 
	LNode *pre=L->next, *p=L->next, *s=p->next, *d; 
	while(s!=NULL){ 
		while(s!=NULL){ 	
			if(p->data==s->data){ 
				d=s;
				s=s->next;
				pre->next=s;    
				free(d);  
				s=pre;
			}else{
				pre=pre->next;
				s=s->next;
			}   	
		} 
		p=p->next;
		pre=p; 
	    s=pre->next;	
	} 
 } 
 
void Del_Same(LinkList L) //综合题十二题 ② 
{ 
	LNode *p=L->next, *q; 
	if(p==NULL) 
	return ; 
	while(p->next!=NULL){ 
		q=p->next; 
		if(p->data==q->data){ 
			p->next=q->next; 
		}else 
		p=p->next; 
	} 
} 
   
LinkList Merger(LinkList A, LinkList B) //综合题第十三题           
{                                                                   
	LNode *preA=A, *preB=B, *pa=A->next, *pb=B->next, *L;       
	L = (LinkList)malloc(sizeof(LNode));                        
	L->next=NULL;                                               
    while(preA->next!=NULL&&preB->next!=NULL){                  
    	if(pa->data<pb->data){                                   
    	preA->next=pa->next;
    	pa->next=L->next;
		L->next=pa; 
		pa=preA->next;
		}else{ 
		preB->next=pb->next;	
		pb->next=L->next;
		L->next=pb;
		pb=preB->next;
		} 	
	} 	
	while(preA->next!=NULL){  
	    preA->next=pa->next;
	    pa->next=L->next;
		L->next=pa;
		pa=preA->next;
	} 
	while(preB->next!=NULL){ 
	    preB->next=pb->next; 
	    pb->next=L->next; 
		L->next=pb;
		pb=preB->next;	
	} 
	free(preA); 
	free(preB); 
	free(pa); 
	free(pb); 
	return L; 
} 

void MergeList(LinkList &La, LinkList &Lb) //
{   
	LNode *r, *pa=La->next, *pb=Lb->next; 
	La->next=NULL; 
	while(pa&&pb) 
		if( pa->data <= pb->data ){ 
			r=pa->next; 
			pa->next=La->next; 
			La->next=pa; 
			pa=r; 
		}else{ 
			r=pb->next; 
			pb->next=La->next; 
			La->next=pb; 
			pb=r; 
		} 
		if(pa) 
		pb=pa;
		while(pb){
			r=pb->next;
			pb->next=La->next;
			La->next=pb;
			pb=r;
		} 
		 while(La->next!=NULL){ 
			La=La->next; 
			printf("%d ",La->data); 
		} 
		free(Lb); 
} 

void Same_Merge(LinkList A, LinkList B) //综合题第14题  
{ 
	LNode *p=A->next, *q=B->next, *r, *s;
	LinkList C=(LinkList)malloc(sizeof(LNode));  
	r=C;  
	
	while( q!=NULL&&p!=NULL ){ 
		if(p->data<q->data)  
		p=p->next; 
		else if(p->data>q->data)  
		q=q->next;
		else{ 
			s=(LNode*)malloc(sizeof(LNode)); 
			s->data=p->data; 
			r->next=s; 
			r=s; 
			p=p->next; 
			q=q->next; 
		} 
	} 
	r->next=NULL; 
	while(C->next!=NULL){ 
		C=C->next; 
		printf("%d ", C->data); 
	} 
} 

LinkList Intersection_Merge(LinkList A, LinkList B) //综合题第15题	
{ 
	LNode *pa=A->next, *pb=B->next, *pc=A, *u; 
	
	while( pa&&pb ){ 
		if( pa->data == pb->data ){  
			pc->next=pa;
			pc=pa;
			pa=pa->next;
			u=pb;
			pb=pb->next;
			free(u);
		} else if( pa->data<pb->data ){ 
			u=pa;
			pa=pa->next;
			free(u);
		} else{ 
			u=pb;
			pb=pb->next;
			free(u);
		} 
	} 
	while(pa){ 
		u=pa;
		pa=pa->next;
		free(u);	
	} 	
	while(pb){ 
		u=pb;
		pb=pb->next;
		free(u);
	} 
	pc->next=NULL;
	free(B);
	return A;
} 
   
int Pattern(LinkList A, LinkList B) //综合题第十六题	
{ 
	LNode *p=A, *pre=p, *q=B; 
	while(p&&q) 
		if(p->data==q->data){ 
			p=p->next; 
			q=q->next; 
		}else{ 
			pre=pre->next; 
			p=pre; 
			q=B; 
		} 
	if(q==NULL) 
	return 1; 
	else 
	return 0; 
} 

int Search_k(LinkList L, int k){	//综合题第21题		
	LNode *p=L->next, *q=L->next;	
	int count=0;	
	while(p!=NULL){ 
		if(count<k) 
		count++;	
		else	
		q=q->next;	
		p=p->next;	
	}	
	if(count<k)	
	return 0;	
	else{	
		printf("%d\n",q->data);	
		return 1;	
	}	
}	

void reverse_new(LinkList L ){   //综合题25题  
		LNode *p, *q, *r, *s;
		p=q=L;
		while( q->next != NULL )//寻找中间节点 
		{
		    p=p->next;
		    q=q->next;
		    if(q->next!=NULL) q=q->next;
		} 
	    
	    q=p->next;
	    p->next=NULL;
	    while(q!=NULL){
	    	r=q->next;
	    	q->next=p->next;
	    	p->next=q;
	    	q=r;
		} 
		
		s=L->next;
		q=p->next;
		p->next=NULL;
		
		while(q!=NULL)
		{
			r=q->next;
			q->next=s->next;
			s->next=q;
			s=q->next;
			q=r;
		}
} 

int main(){    
	int x, i, n, a, b;	
	LNode *L, *A, *B, *s, *p;	
	show();	
	printf("输入菜单序号:");	
	scanf("%d", &n);     
	
    while(n!=0){  
    if( n==1 ){  
	printf("输入数字序列 ,以9999结束:"); 
	L = List_HeadInsert(L);  
	} 
	if( n==2 ){  
	printf("输入数字序列 ,以9999结束:"); 
    L = List_TailInsert(L); 
	} 
    if( n==3 ){  
    	printf("\n输入查找的序号:");  
    	scanf("%d", &x);  
    	B = GetElem(L, x);  
    	printf("序号%d的数字为%d\n",x, B->data);   
	}   
	if( n==4 ){  
		scanf("%d", &x);   
		i = LocateElem(L, x);   
		if(i!=0)   
		printf("元素%d在第%d个位置.\n",x, i+1);   
		if(i==0)   
		printf("元素不在链表中。\n");   
	}   
	if( n==5 ){  
		printf("输入插入的位置,元素:\n");  
		scanf("%d %d", &i, &x);  
		s = (LNode*)malloc(sizeof(LNode));  
		s->data = x;  
		Insert(L, s, i);   
	} 
	if( n==6 ){  
		printf("输入要删除的结点位置:"); 
		scanf("%d", &x); 
		ListDelete(L, x); 
	} 	
	if( n==7 ){  
		LNode *u=L;  
        while(u->next!=NULL){  
		u=u->next;  
		printf("%d ", u->data);  
	    } 
	} 
	if( n==8 ){ //不带头结点  
		printf("输入要删除的元素:");
		scanf("%d", &x);
		Del_X_3(L, x);
	} 
	if( n==9 ){
		printf("输入要删除的元素:");
		scanf("%d", &x);
		Del_X_2(L,x); 	
	} 
	if( n==10 ){
		printf("输入要删除的元素:");
		scanf("%d", &x);
		Del_X_1(L,x); 	
	} 
	if( n==11 ){
	  Print(L);
	}
	if( n==12 ){
		 Del_Min(L);
	}
    if( n==13 ){ 
      //Reverse_1(L);//第二种方法  
    	Reverse_2(L);
	} 
	if( n==14 ){
		Sort(L);  
	}
	if( n==15 ){
		printf("输入两个固定值");
		scanf("%d %d", &a, &b);
		Del_deter( L, a, b );
	}
	if( n==16 ){
		Min_Delete(L);
	} 
	if( n==17 ){
	    Div_List( L ); 
	} 
	if( n==18 ){
		B = DisCreat_1(L);
		while(B->next!=NULL){
			B=B->next;
			printf("%d ", B->data);
		} printf("\n");
		while(L->next!=NULL){ 
			L=L->next;
			printf("%d ",L->data);
		} 
	} 
	if( n==19 ){ 
		B=DIsCreat_2(L);
		printf("aaaa\n");	 
	} 
	if( n==20 ){ 
		Del_same(L);
	} 
	if( n==21 ){ 
		Del_Same(L);
	} 
	if( n==22 ){ 
	printf("请输入第一行数列:"); 
		A=List_TailInsert(L); 
	printf("请输入第二行数列:"); 
		B=List_TailInsert(L); 
		L = Merger(A, B); 
		printf("合并后链表:"); 
		while(L->next!=NULL){ 
			L=L->next; 
			printf("%d ",L->data); 
		} 
	} 
	if( n==23 ){ 
	printf("请输入第一行数列:"); 
		A=List_TailInsert(L); 
	printf("请输入第二行数列:"); 
		B=List_TailInsert(L); 
	    MergeList(A, B);  
	} 
    if( n==24 ){ 
    printf("请输入第一行数列:"); 
		A=List_TailInsert(L); 
	printf("请输入第二行数列:"); 
		B=List_TailInsert(L); 
    	Same_Merge(A, B); 
	} 
    if( n==25 ){  
    printf("请输入第一行数列:"); 
		A=List_TailInsert(L); 
	printf("请输入第二行数列:"); 
		B=List_TailInsert(L); 
    	L=Intersection_Merge(A , B); 
    		printf("合并后链表:"); 
		while(L->next!=NULL){ 
			L=L->next; 
			printf("%d ",L->data); 
		} 
	}  
	if( n==26 ){
		printf("请输入第一行数列:"); 
		A=List_TailInsert(L); 
	printf("请输入第二行数列:"); 
		B=List_TailInsert(L); 
		x=Pattern(A,B);
		if(x)
			printf("1\n");
		else
			printf("0\n");
	}
	if( n==27 ){
		printf("输入需要输出的倒数位数:");
		scanf("%d", &x);
		i = Search_k(L, x);
		printf("%d", i);
	} 
	if( n==28 ){
		
		reverse_new(L);
	}
	
	printf("\n输入菜单序号:"); 
    scanf("%d", &n); 
	}            
	return 0;    
}                

void show(){ 
	printf("\n"); 
	printf("                      |------------------------------链表---------------------------|\n");
	printf("                      |      0.退出                            22.倒序合并 ①       |\n");
	printf("                      |      1.头插法建立链表                  23.倒序合并 ②       |\n");
	printf("                      |      2.尾插法建立链表                  24.交集合并(新链)    |\n");
	printf("                      |      3.序号查找                        25.交集合并(旧链)    |\n");
	printf("                      |      4.元素查找                        26.判断              |\n");
	printf("                      |      5.插入元素                        27.查找(倒数)        |\n");
	printf("                      |      6.删除元素                        28.重新排列          |\n");
	printf("                      |      7.显示元素                                             |\n");
	printf("                      |      8.删除指定值(递归) N                                   |\n");	//8.不带头结点  
	printf("                      |      9.删除指定值 Y①                                       |\n");	//带头结点  
	printf("                      |     10.删除指定值 Y②                                       |\n");	//带头结点  
	printf("                      |     11.反向输出链表                                         |\n");	//带头结点  
	printf("                      |     12.删除最小值                                           |\n");	//带头结点  
	printf("                      |     13.逆转链表                                             |\n");	//带头结点 		
	printf("                      |     14.链表排序                                             |\n");	//带头结点 
	printf("                      |     15.删除值域                                             |\n");	//带头结点 	
	printf("                      |     16.递增输出删除                                         |\n");	//带头结点  
	printf("                      |     17.奇偶数分链                                           |\n");	//带头结点
	printf("                      |     18.奇偶序号分链                                         |\n");	//带头结点 
	printf("                      |     19.正倒序分链                                           |\n");	//带头结点 
	printf("                      |     20.删除相同元素 ①                                      |\n");	//带头结点 
	printf("                      |     21.删除相同元素 ②                                      |\n");	//带头结点 	
	printf("                      |-------------------------------------------------------------|\n");
} 

 

 

栈:

#include<stdio.h>  
#include<stdlib.h>  

#define  MaxSize 50 
typedef int  Elemtype;
typedef struct {
	Elemtype data[MaxSize];
	int top;
}SqStack;
void show();

void InitStack(SqStack &S){ 
	S.top=-1; //初始化顶置栈针  
} 

bool StackEmpty(SqStack S){ 
	if( S.top==-1 ) //栈空  
	return true;
	else           //不空  
	return false;
} 

bool Push(SqStack &S, Elemtype x){
	if( S.top==MaxSize-1 ) //栈满  
	    return false;
	S.data[++S.top]=x;//指针先加一  
	return true;
} 

int Pop(SqStack &S) { 
	if( S.top==-1 ) 
	return false;
	 
	return (S.data[S.top--]); 
}

bool GetTop(SqStack S, Elemtype &x ){ 
	if( S.top==-1 ) 
	return false; 
	x=S.data[S.top]; 
	return true;
} 

int main(){
	
	SqStack S;
	int n, i, x;
	
	InitStack(S); //初始化栈针  
	bool T=StackEmpty(S);
	show();
	
	while(1){
		printf("选择功能,输入0时退出:");
	    scanf("%d", &n);
	    if( n==0 )
	    break;
	    
	   	
		switch(n){
			case 1: { 
			    printf("输入数字,以-1结束: ");
				scanf("%d", &x);
				while(T&&x!=-1 ){
				Push(S, x);
				scanf("%d", &x);
				}
			}break; 
			case 2: {
				printf("栈列为:");
				while( StackEmpty(S)==false ){ 
					printf("%d ",  Pop(S));  
				} 
				printf("\n"); 
			}break;
		}
	}
	
	
}

void show() //显示堆栈菜单 
{
	printf("\n\n");
	printf("                        堆栈显示系统            \n"); 
	printf("               |-----------------------------|\n");
	printf("               |        1-----进 栈          |\n"); 
	printf("               |        2-----出 栈          |\n");
	printf("               |        3-----显 示          |\n");
	printf("               |        4-----数 字 转 换    |\n");
	printf("               |        0-----返 回          |\n");
	printf("               |-----------------------------|\n");
	printf("\n");
}

这是用顺序表实现的栈,链表也可以。

_________________________________________________________________________________________________

这个是老链表了,我是用浙大的数据结构课本内容学着写的。

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100

typedef struct SNode *PtrToSNode;
typedef int Position;
struct SNode
{
	int *date;
	int Top;
	int MaxSize;
};
typedef PtrToSNode Stack;

void show();
Stack CreatStack(int MaxSize);
bool isfull(Stack S);
bool Push(Stack S, int X );
bool isempty(Stack S);
int Pop(Stack S);
void Transfer(Stack S, int date );

int main()
{
	int i, date=0, n=0;
	Stack S = (Stack)malloc(sizeof(struct SNode));
	show();
	
	while(1)
	{
	    printf("请选择菜单序号输入:");
	    scanf("%d", &n);
	    if( n==0 )
	    break;
	    
        switch(n)
        {
       	case 1:
        {
       	S = CreatStack(MAXSIZE);
        i = 0;
        printf("输入数字,输入0时退出:");	
        while(1)
	        {
	        scanf("%d", &date);
	        if(date == 0 || i>MAXSIZE)
	        break;
	        Push(S, date);
	        i++;
	        }
        }
        break;
       
        case 2:
        printf("出栈数字为:%d\n\n", Pop(S));
        break;
       
        case 3:
        {
        printf("当前堆栈顺序为:");
		while(true)
	        {
	        	printf("%d", Pop(S));
	        	if( S->Top == -1 )
	        	break;
	        }
	        printf("\n\n");
        }
        break;
       
        case 4:
        {
	   	printf("请输入一个十进制的正整数:");
		scanf("%d" , &date);
		S = CreatStack(MAXSIZE); 
	    Transfer(S, date);
        }
        break;
        }
    }
}
Stack CreatStack(int MaxSize)
{
	Stack S = (Stack)malloc(sizeof(struct SNode));
	S->date = ( int * )malloc(MaxSize*sizeof(int));
	S->Top = -1;
	S->MaxSize = MaxSize;
	
	return S;
}

bool isfull(Stack S)//查看是否栈满 
{
	return ( S->Top == S->MaxSize-1 );
}
bool Push( Stack S, int X )//入栈操作 
{
	if(isfull(S))
	{
	printf("堆栈满");
	return false;
	}
	else
	{
	S->date[++(S->Top)] = X;
	return true;
    }
}

bool isempty(Stack S)
{
	return (S->Top==-1);
}

int Pop(Stack S)//出栈操作 
{
	if(isempty(S))
	{
		printf("堆栈空");
	    return false;	
	}
	else
	{
		return (S->date[(S->Top)--]);
	}
}

void Transfer(Stack S, int date )
{
    printf("\n %d二进制为: ",date);
	Position u=date, k=0;
	while(u)
	{   
		k = u%2;
		u = u/2;
		Push(S, k);
	}
	while(1)
    {
    	printf("%d", Pop(S));
    	if( S->Top==-1 )
    	break;
    }
    printf("\n\n");
}

void show() //显示堆栈菜单 
{
	printf("\n\n");
	printf("                        堆栈显示系统            \n"); 
	printf("               |-----------------------------|\n");
	printf("               |        1-----进 栈          |\n"); 
	printf("               |        2-----出 栈          |\n");
	printf("               |        3-----显 示          |\n");
	printf("               |        4-----数 字 转 换    |\n");
	printf("               |        0-----返 回          |\n");
	printf("               |-----------------------------|\n");
	printf("\n");
	 
}

____________________________________________________________________________________________________

#include<stdio.h>  
#include<stdlib.h>  

#define MaxSize 50
typedef int ElemType;
typedef struct{
	ElemType data[MaxSize];
	int front,rear;
}SqQueue;

void InitQueue(SqQueue &Q){
	Q.rear=Q.front=0; //初始化队首队尾   
} 

bool isEmpty( SqQueue Q ){ //判断队列为空   
	if( Q.rear == Q.front ) return true;
	else return false;
} 

bool EnQueue( SqQueue &Q, ElemType x){  
	if( (Q.rear+1)%MaxSize==Q.front ) return false;//队满则报错 
	Q.data[Q.rear]=x; 
	Q.rear=(Q.rear+1)%MaxSize; //队尾指针加一取模  
	return true; 
} 

bool DeQueue(SqQueue &Q){ //出队   
	if( Q.rear==Q.front ) return false; //队空则报错  
//	x=Q.data[Q.front]; 
	Q.front=(Q.front+1)%MaxSize; //队头指针加一  
	return true; 
} 

int main(){ 
	SqQueue Q; 
	int n, x, i; 
	InitQueue(Q); 
	bool T=isEmpty(Q);
	
    printf("输入队列,以-1结束: ");
    
	while(T){ 
	scanf("%d", &x);
	if(x==-1) break;
	EnQueue(Q,x);	
	}  
	while( !isEmpty(Q) ){
		printf("%d ", Q.data[Q.front]);
		 DeQueue(Q);
	}
	return 0;
}

 

——————————————————————————————————————————————————————

队列的链表实现

#include<stdio.h>   
#include<stdlib.h>  
 
typedef int ElemType;  
typedef struct LinkNode{  
	ElemType data; 
	struct LinkNode *next;
	LinkNode *front, *rear;  
}LinkNode,LinkQueue; 

void InitQueue( LinkQueue &Q ){     //初始化 
	Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));//建立头结点 
	Q.front->next=NULL;    //初始为空  
} 

bool IsEmpty(LinkQueue Q){ //判断队空  
	if(Q.front==Q.rear) return true;
	else return false; 
} 

bool EnQueue(LinkQueue &Q, ElemType x){ //入队   
     LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));  
     s->data=x; 
     s->next=NULL; 
     Q.rear->next=s; 
     Q.rear=s; 
} 

bool DeQueue(LinkNode &Q){ //出队   
	if(Q.front==Q.rear) return false;
	LinkNode *p= Q.front->next; 
	printf("%d ",p->data);
	Q.front->next=p->next; 
	if( Q.rear==p ) 
	    Q.rear=Q.front;  //若原队列只有一个节点,删除后变空  
	free(p); 
	return true;  
} 

int main(){ 
	LinkQueue Q; 
	int x=0, n; 
	InitQueue(Q); 
	bool T=IsEmpty(Q); 
	printf("输入队列,以-1结束:"); 
	while(T){
		scanf("%d", &x);
		if(x==-1)break;
		 EnQueue(Q, x);
	}
	printf("\n队列为:");
	while(!IsEmpty(Q)){
		 DeQueue(Q);
	} 
	
	return 0;
}

一边刷课本习题一边更新。

 

  • 34
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值