C链表应用 综合

链表

双链表

#include<stdio.h>
#include<stdlib.h>
//定义数据类型 
typedef struct Dlink{
    
    
	int elem;
	struct Dlink *ahead;
	struct Dlink *next;
} dlink;

//生成双链表函数
dlink *initDlink(){
    
    
	dlink *p = (dlink*)malloc(sizeof(dlink));
	dlink *temp = p;
	p->ahead = NULL;
	p->next = NULL;
	for(int i=1;i<5;i++){
    
    
		dlink *node = (dlink*)malloc(sizeof(dlink));
		node->elem = i;
		node->next = NULL;
		node->ahead = temp;
		temp->next = node;
		temp = temp->next;
	}
	return p;
} 

//插入双链表函数
dlink *insertNode(dlink *p,int address,int elem){
    
    
	dlink *temp = p;
	if(address <= 0){
    
    
		printf("插入位置无效!!\n");
		return p;
	}
	for(int i=1;i<address;i++){
    
    
		temp = temp->next; 
		if(temp == NULL){
    
    
			printf("插入位置无效!!\n");
			return p;
		} 
	}
	dlink *node = (dlink*)malloc(sizeof(dlink));
	node->ahead = temp; 
	node->next = temp->next;  
	node->elem = elem;
	//判断插入的位置是否为最后一位,做特殊处理 
	if(temp->next){
    
    
		temp->next->ahead = node;
		temp->next = node;
		return p;
	}
	temp->next= node;
	return p;
}

//删除节点函数
dlink *delNode(dlink *p,int address){
    
    
	dlink *temp = p;
	for(int i=1;i<address;i++){
    
    
		temp = temp->next;
		if(temp == NULL){
    
    
			printf("删除位置无效!!\n");
			return p;
		}
	}
	dlink *dels = temp->next;
	temp->next = dels->next;
	dels->next->ahead = temp;
	free(dels); 
	return p;
} 

//查找元素函数


//更新元素函数
 

//输出双链表函数
void show(dlink *p){
    
    
	dlink *temp = p;
	temp = temp->next;
	while(temp){
    
    
		printf("%5d",temp->elem);
		temp = temp->next;
	}
	printf("\n");
} 

int main(){
    
    
	dlink *p = initDlink();					//初始化双链表 
	printf("初始化双链表为:\n");
	show(p);
	dlink *insert = insertNode(p,5,8);
	printf("插入节点后的双链表为:\n");
	show(insert);				
	dlink *dele = delNode(p,2);
	printf("删除节点后的双链表为:\n");
	show(dele);
	return 0;
}

单链表

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

typedef struct Link{
	int elem;
	struct Link *next;
}link;

//初始化链表函数 
link *initLink(int num){
	srand((unsigned int)time(NULL));			//初始化种子为随机值 
	link *p = (link*)malloc(sizeof(link));
	link *temp = p;
	for(int i=1;i<num;i++){
		link *node = (link*)malloc(sizeof(link));
		int data = rand() % 10 + 1;				//随机生成 1-10 的数据 
		node->elem = data;
		node->next = NULL;
		temp->next = node;
		temp = temp->next;
	}
	return p;
}

//插入节点函数
link *insertNode(link *p,int add,int elem){
	link *temp = p;
	if(add <= 0){
		printf("插入位置无效! \n");
		return p;
	}
	for(int i=1;i<add;i++){
		temp = temp->next;
		if(temp == NULL){
			printf("插入位置无效!\n");
			return p;
		} 
	} 
	link *node = (link*)malloc(sizeof(link));
	node->next = temp->next;
	temp->next = node;
	node->elem = elem;
	return p;
	
} 

//删除节点函数
link *delNode(link *p,int del){
	link *temp = p;
	if(del <= 0){
		printf("删除失败,没有此节点!\n");
		return p;
	}
	for(int i=1;i<del ; i++){
		temp = temp->next;
		if(temp->next == NULL){ 
			printf("删除失败,没有此节点!\n");
			return p; 
		}
	}
	link *delete = temp->next;
	temp->next= temp->next->next;
	free(delete);
	return p;
} 

//更新元素函数
link *updatElem(link *p,int add,int newelem){
	link *temp = p;
	if(add <= 0){
		printf("更新失败,没有此节点!\n");
		return p;
	}
	for(int i=1; i<add ;i++){
		temp = temp->next;
		if(temp == NULL){
			printf("更新失败,没有此节点!\n");
			return p;
		}
	}
	temp = temp->next;
	temp->elem = newelem;
	return p;
} 

//查找元素函数
int findElem(link *p,int elem){
	link *temp = p;
	temp = temp->next;
	int i=1;
	while(temp->next){
		if(temp->elem == elem){
			return i;
		}
		i++;
		temp = temp->next;
	}
	return 0;
} 

//输出链表函数 
void display(link *p){
	link *temp = p;
	while(temp->next){
		temp = temp->next;
		printf("%5d",temp->elem);
	}
	printf("\n");
}

int main(){ 
	int num = 10;
	link *p = initLink(num);						//初始化链表 
	printf("初始化链表为:\n");
	display(p);
	link *insert = insertNode(p,10,8);			//插入节点 
	printf("插入节点后的链表为:\n");
	display(insert);
	link *dele = delNode(insert,6);				//删除节点 
	printf("删除节点后的链表为:\n");
	display(dele);
	link *update = updatElem(dele,2,10);		//更新节点元素 
	printf("更新后节点后的链表为:\n");
	display(update);
	int find = findElem(update,100);			//查找元素 
	if(find){
		printf("查找成功,该元素在第 %d 个节点上\n",find);
	}else{
		printf("查找失败,没有该元素信息\n");
	}
} 

顺序表

#include<stdio.h>
#include<stdlib.h>
#define max_size 4
typedef int datatype;

typedef struct xxb{
	datatype *a;
	int length;
}xxb;

//初始化,分配空间函数 
void init(xxb *L){
	L->a = (datatype *)malloc(sizeof(datatype) * max_size);
	L->length = 0;
}

//赋初值函数 
void init_data(xxb *L,int i){
	L->a[i] = i+1;
	L->length++;
}

//插入函数 
int insert_data(xxb *L,int i,datatype x){
	//判断是否可插入
	if(i<1 || i>L->length){
		printf("insert data fialed!!\n");
		return 0;
	} 
	for(int j=L->length-1;j>=i-1;j--)		//插入数据,移动数据 
		L->a[j+1] = L->a[j];
	L->a[i-1]=x;
	L->length++;
	return 1;
}

//查找函数
int find_data(xxb *L, int i,datatype *x){
	//判断数据是否存在 
	if(i<1 || i>L->length){
		printf("find data fialed!!\n");
		return 0;
	} 
	*x = L->a[i-1];
	return 1;
} 

//删除函数
int del_data(xxb *L,int i,datatype *x){
	//判断数据是否存在 
	if(i<1 || i>L->length){
		printf("delete data fialed!!\n");
		return 0;
	}
	*x = L->a[i-1];
	for(int j=i;j<L->length;j++)
		L->a[j-1] = L->a[j];
	L->length--;
	return 1;
} 

int main(){
	xxb L;
	int i;
	datatype x;
	init(&L);									//初始化,分配空间 
	for(i=0;i<max_size;i++)
		init_data(&L,i);						//赋初值
	if(insert_data(&L,2,8)){
		printf("insert scceuss!!!\n");			//插入数据成功输出 
	}
	if(find_data(&L,2,&x)){
		printf("you find data is %d\n",x);		//查找数据并输出 
	}
	if(del_data(&L,2,&x)){
		printf("you delete data is %d\n",x);	//删除数据并输出 
	}
	for(i=0;i<L.length;i++)
		printf("%5d\n",L.a[i]);					//查看所有数据 
	return 0;
}

单链表–数据结构版

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

//单链表 
typedef struct Link{
	int data;
	struct Link *next;
} link ;

//初始化链表头结点,生成一个头结点 
void initLink(link **head){
	*head = (link*)malloc(sizeof(link));
	(*head)->next = NULL;
}

//插入函数
int insertNode(link *p,int data,int address){
	link *temp = p;
	int i = 0;
	while((i<address-1) && (temp->next)){
		temp = temp->next;
		i++;
	}
	if(i == address-1){
		link *node = (link*)malloc(sizeof(link));
		node->next = temp->next;
		temp->next = node;
		node->data = data;
		return 1;
	}
	return 0;
}

//删除函数
int delNode(link *p,int address){
	link *temp  = p;
	int i = 0;
	if(address <= 0) return 0;
	while((i<address-1) && (temp->next)){
		temp = temp->next;
		i++;
	}
	if(temp->next){
		link *frees = temp->next;
		temp->next = temp->next->next;
		free(frees);
		return 1;
	}
	return 0;	
} 

//节点,元素随机生成函数
int randNode(link *p,int num){
	link *temp = p;
	srand((unsigned int)time(NULL));
	for(int i=0;i<num;i++){
		link *node = (link*)malloc(sizeof(link));
		node->next = temp->next;
		node->data = rand()%100 + 1;
		temp->next = node;
		temp = temp->next;
	}
	return 1;
	
} 

//更新元素函数
int update(link *p,int data,int address){
	link *temp = p;
	int i = 0;
	if(address <= 0) return 0;
	while(i<address-1 && temp->next){
		temp = temp->next;
		i++;
	}
	if(temp->next){
		temp = temp->next;
		temp->data = data;
		return 1;
	}		
	return 0;
} 

//查找函数
int find(link *p,int data){
	link *temp = p;
	int i = 1;
	while(temp->next){
		temp = temp->next;
		if(temp->data == data){
			return i;
		}
		i++;
	}
	return 0;
} 

//输出整个链表元素函数 
void display(link *p){
	link *temp = p;
	while(temp->next){
		temp = temp->next;
		printf("%5d",temp->data);
	}
	printf("\n");
}

 
int main(){
	link *head;
	link *news;
	initLink(&news);
	initLink(&head);
	if(insertNode(head,8,1)){
		printf("插入成功!\n");
	}else{
		printf("位置无效\n");
	}
	if(randNode(news,10)){
		printf("随机生成!\n");
	}
	display(news);
	if(delNode(news,1)){
		printf("删除成功!\n");
		display(news);
	}else{
		printf("删除失败!\n");
	}
	if(update(news,1000,9)){
		printf("更新成功!\n");
		display(news);
	}else{
		printf("更新失败!\n");
	}
	int i = find(news,1000); 
	if(i){
		printf("查找成功,在第%d 个节点\n",i);
	}else{
		printf("查找失败\n");
	}
} 

顺序栈,进制转换

#include<stdio.h>
#include<stdlib.h>
#define max_size 10

//抽象数据类型 
typedef struct stack{
	int *a;
	int top;
} stack;

//判空 
int Empty(stack *L){
	return (L->top == -1);
} 

//判满 
int Full(stack *L){
	return (L->top == max_size);
}

//初始化栈 
void initStack(stack *L){
	L->a = (int *)malloc(sizeof(int) * max_size);
	L->top = -1;
}

//入栈 
int push(stack *L,int elem){
	L->a[(++L->top)] = elem;
} 


//出栈/输出 
int pop(stack *L){
	int length = L->top+1;
	if(Empty(L)){
		printf("Error\n");
		return 1;
	}
	for(int i=0;i<length;i++){
		printf("%5d",L->a[(L->top--)]);
	}
	printf("\n");
	return 0;
} 

//十六进制进制输出
int pop_change(stack *S){
	int length = S->top+1;
	int j = 0;
	if(Empty(S)){
		printf("Error\n");
		return 1;
	}
	for(int i=0;i<length;i++){
		if(S->a[S->top] == 10) printf("A");
		else if(S->a[S->top] == 11) printf("B");
		else if(S->a[S->top] == 12) printf("C");
		else if(S->a[S->top] == 13) printf("D");
		else if(S->a[S->top] == 14) printf("E");
		else if(S->a[S->top] == 15) printf("F");
		else printf("%d",S->a[S->top]);
		S->top--; 
	}
	printf("\n");
	return 0;
} 

//进制转换
int change(int n,int m){
	stack S;
	initStack(&S);
	while(n != 0){
			push(&S,n%m);
			n = n/m;
	} 
	if(m<9) pop(&S);
	else pop_change(&S);
	return 0;
}

int main(){
	stack L;
	initStack(&L);
	if(Full(&L)) return 0;
	if(Empty(&L)){
		for(int i = 0;i<max_size; i++){
			push(&L,i);
		}
	}
	pop(&L);
	change(3456,16);
} 



/*
int change(stack *S,int n,int m){
	while(n != 0){
		S->a[(++S->top)] = n%m;
		n = n/m;
	} 
	return 0;
}
*/

猜你喜欢

转载自blog.csdn.net/qq_46635165/article/details/115658376
今日推荐