数据结构-day4

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#include 
#include 
#include 
enum
{
	FALSE=-1,
	SUCCESS
};
typedef struct Student
{
	char name[20];
	char sex;
	float score;
}Stu;
typedef Stu datatype;
//定义节点结构体
//节点:数据域 指针域
typedef struct Node
{
	//数据域:存储数据元素
	datatype data;
	//指针域:存储下一个节点的地址
	struct Node *next;
}*Linklist;
Linklist insert_head(Linklist head,datatype element);
Linklist create();
void output(Linklist head);
Linklist insert_rear(Linklist head,datatype element);
Linklist delete_head(Linklist head);
Linklist delete_rear(Linklist head);
Linklist insert_pos(Linklist head,int pos,datatype element);
Linklist delete_pos(Linklist head,int pos);
void update_pos(Linklist head,int pos,datatype element);
Linklist rev(Linklist head);
void search_pos(Linklist head ,int pos);
void last_n(Linklist head,int n);
Linklist delete_key(Linklist head,datatype key);
void update_key(Linklist head,datatype key ,datatype element);
int search_key(Linklist head,datatype key);
void simple_sort(Linklist head);
Linklist free_space(Linklist head);
void Bubble(Linklist head);
#endif

main.c


#include "head.h"
int main(int argc, const char *argv[])
{
	Linklist head=NULL; //定义单链表的头指针
	int n;
	datatype element;//插入的值
	printf("please enter n:");
	scanf("%d",&n);
	for(int i=0;i

test.c

#include "head.h"
Linklist create(){
	Linklist p=(Linklist)malloc(sizeof(struct Node));
	if(!p)
		return NULL;
	strcpy(p->data.name,"No");
	p->data.sex='N';
	p->data.score=-1;
	p->next=NULL;
	return p;
}
Linklist input(Linklist q,datatype element){
        strcpy(q->data.name,element.name);
        q->data.sex=element.sex;
        q->data.score=element.score;
	return q;
}
Linklist insert_head(Linklist head,datatype element){
	Linklist q=create();
	strcpy(q->data.name,element.name);
        q->data.sex=element.sex;
        q->data.score=element.score;
	if(!head)
		head=q;
	else{
		q->next=head;
		head=q;
	};
}
void output(Linklist head){
	if(!head){
		puts("empty");
		return;
	}
	Linklist p=head;
	while(p){
		printf("%s,%c,%.1f\n",p->data.name,p->data.sex,p->data.score);
		p=p->next;
	}
	
}
Linklist insert_rear(Linklist head,datatype element){
	Linklist q=create();
//	strcpy(q->data.name,element.name);
//	q->data.sex=element.sex;
//	q->data.score=element.score;
        q=input(q,element);
	if(!head)
		head=q;
	else{
		Linklist p=head;
		while(p->next)
			p=p->next;
		p->next=q;
	}
	return head;
}
Linklist delete_head(Linklist head){
	if(!head){
		puts("empty");
		return head;
	}
	Linklist p=head;
	head=head->next;
	free(p);
	p=NULL;
	return head;	
}
Linklist delete_rear(Linklist head){
	if(!head)//当链表为空
		return head;
	if(!head->next)//只有一个节点
	{
		free(head);
		head=NULL;
		return head;
	}
	//多个节点
	Linklist p=head;
	while(p->next->next){
		p=p->next;
	}
	free(p);
	p=NULL;
	return head;
}
int length(Linklist head){
	int len=0;
	Linklist p=head;
	while(p){
		p=p->next;
		len++;
	}
	return len;
}
Linklist insert_pos(Linklist head,int pos,datatype element){
	//判断位置是否合法
	if(pos<1||pos>length(head)+1){
		puts("error");
		return head;
	}
	//插入位置为1
	if(pos==1){
		head=insert_head(head,element);
		return head;
	}
        //插入位置不为1
        //找到pos-1的位置,插入pos-1的后面
	Linklist p=head;
	for(int i=0;inext;
	}
	Linklist q=create();
	q=input(q,element);
	q->next=p->next;
	p->next=q;
	return head;
}
Linklist delete_pos(Linklist head,int pos){
	if(pos<1||pos>length(head)+1)
		return head;
	if(!head)
		return head;
	if(pos==1){
		delete_head(head);
		return head;
	}
	Linklist p=head;
	for(int i=0;inext;
	}
	Linklist q=p->next;
	p->next=q->next;
	free(q);
	q=NULL;
	return head;	
}

void update_pos(Linklist head,int pos,datatype element){
	if(pos<1||pos>length(head)+1)
		return head;
	if(pos==1){
		head=input(head,element);
		return head;
	}
	Linklist p=head;
	for(int i=0;inext;
	}
	p=input(p,element);
	return head;
}
Linklist rev(Linklist head){
	if(!head)
		return head;
	Linklist p=head->next;
	head->next=NULL;
	while(p)//p作为链表的新头
	{
		Linklist t=p;//t作为新链表的头
		p=p->next;
		t->next=head;
		head=t;
	}
	return head;
void search_pos(Linklist head ,int pos){
	if(NULL==head || pos<1 || pos>length(head))
		return;
	Linklist p=head;
	for(int i=1;inext;
	}
	printf("search by pos is %s,%c,%.1f\n",p->data.name,p->data.sex,p->data.score);
}
//倒数第n:正数第len-n+1   len --> n+while(p)-1
void last_n(Linklist head,int n){
	if(NULL==head || n<1 || n>length(head))
		return ;
	Linklist p,q;
	p=q=head;
	//p走n步
	for(int i=0;inext;
	}
	//p和q走
	while(p)
	{
		p=p->next;
		q=q->next;
	}
	printf("last n is %s,%c,%.1f\n",p->data.name,p->data.sex,p->data.score);
}
Linklist delete_key(Linklist head,datatype key);
void update_key(Linklist head,datatype key ,datatype element);
int search_key(Linklist head,datatype key);
void simple_sort(Linklist head);//简单选择排序
Linklist free_space(Linklist head){//head=free_space(head);
	if(!head)
		return NULL;
	while(head)
	{
		head=delete_head(head);
	}
	return head;
void Bubble(Linklist head)
{
	if(NULL==head)
		return;

	int len=length(head);
	printf("%d  \n",len);
	for(int i=1;idata.score > p->next->data.score)
			{
				datatype t;
				strcpy(t.name,p->data.name);
				t.sex=p->data.sex;
				t.score=p->data.score;
				p=input(p,p->next);
				strcpy(p->next->data.name,t.name);
				p->next->data.sex=t.sex;
				p->next->data.score=t.score;
			}
				p=p->next;
		}
	}
}

结果展示:

数据结构-day4_第1张图片

你可能感兴趣的:(数据结构)