数据结构day7

 1.顺序表插入+删除,去重

#include "head.h"

/*
 * function:    创建顺序表
 * @param [ in] 
 * @param [out] 
 * @return      成功返回顺序表地址,失败返回NULL
 */
seqlist *create(){
	seqlist *list=(seqlist *)malloc(sizeof(seqlist));
	if(NULL==list)return NULL;
	//初始化
	memset(list->data,0,sizeof(list->data));
	list->len=0;
	return list;
}


/*
 * function:    插入-尾部
 * @param [ in] 
 * @param [out] 顺序表list,插入的值
 * @return      成功0;失败-1
 */
int insert_list(seqlist *list,datatype e){
	//判满,判存在
	if(NULL==list || list->len==Maxsize)return -1;
	list->data[list->len++]=e;
	return 0;
}

/*
 * function:    顺序表输出
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void output(seqlist *list){
	//判空,判存在
	if(NULL==list || list->len==0)return;
	for(int i=0;i<list->len;i++){
		printf("%d ",list->data[i]);
	}
	puts("");
}

/*
 * function:    顺序表去重
 * @param [ in] 
 * @param [out] 顺序表 
 * @return      成功0;失败-1
 */

int re_rep(seqlist *list){
	if(NULL==list || list->len==0)return -1;
	for(int i=0;i<list->len-1;i++){
		for(int j=i+1;j<list->len;j++){
			if(list->data[i]==list->data[j]){
				for(int x=j;x<list->len;x++){
					list->data[x]=list->data[x+1];//后移
				}
				list->len--;
				j--;
			}
		}
	}
}

2.链表头插头删,尾插尾删

#include "head.h"
/*
 * function:    创建头结点
 * @param [ in] 
 * @param [out] 1.头结点;0.其他节点
 * @return      成功返回地址,失败返回NULL
 */
linklist *create(int flag){
	linklist *L=(linklist *)malloc(sizeof(linklist);
	if(NULL==L)return NULL;
	//初始化
	if(flag==1)
		L->len=0;
	else if(flag==0)
		L->data=0; 
	L->next=NULL;  //对L的指针域初始化指向null
	return L;
}

/*
 * function:    头插
 * @param [ in] 头结点 插入的值
 * @param [out] 
 * @return      成功返回0;失败-1
 */
int inert_head(linklist *L,datatype e){
	if(NULL==L)return -1;
	linklist *s=create(0);
	if(NULL==s)return -1;
	s->data=e;
	s->next=L->next;
	L->next=s;
	L->len++;
	return 0;
}

/*
 * function:    输出
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void output(linklist *L){
	if(NULL==L || L->next==NULL)return;
	linklist *p=L;
	while(p->next!=NULL){
		p=p->next;
		printf("%d ",p->data);
	}
	puts("");
}

/*
 * function:    尾插
 * @param [ in] 
 * @param [out] 头结点 ,插入的元素,尾节点
 * @return      成功返回尾地址
 */
linklist *insert_rear(linklist *L,datatype e,linklist *rear){
	if(NULL==L)return NULL;
	linklist *s=create(0);
	if(s==NULL)return NULL;
	s->data=e;
	rear->next=s;
	rear=s;
	L->len++;
	return rear;
}

/*
 * function:    头删
 * @param [ in] list
 * @param [out] 
 * @return      
 */
int delete_head(linklist *L){
	if(NULL==L || NULL==L->next)return -1;
	linklist *q=L->next;
	L->next=q->next;
	free(q);
	q=NULL;
	L->len--;
	return 0;
}

/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int delete_rear(linklist *L){
	if(NULL==L || NULL==L->next)return -1;
	linklist *p=L;
	while(p->next->next!=NULL){//循环到倒数第二个节点
		p=p->next;
	}
	free(p->next);//释放最后一个
	p->next=NULL;
	L->len--;

	return 0;
}

/*
 * function:    逆至
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void rev_linklist(linklist *L){
	if(NULL==L || NULL==L->next)return;
	linklist *p=L->next;//保存头结点
	L->next=NULL;//断开
	while(p!=NULL){
		linklist *t=p;//保存p节点
		p=p->next;
		L->next=t;
	}
}

/*
 * function:    排序
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void linklist_bubble(linklist *L){
	if(NULL==L || NULL==L->next)return;
	for(linklist i=L->next;i->next!=NULL;i=i->next){
		int count=0;
		for(linklist j=L->next;j->next!=NULL;j=j->next){
			if(j->data>j->next->data){
				datatype t=j->data;
				j->data=j->next->data;
				j->next->data=t;
				count++;
			}
		}
		if(count==0)break;
	}	
}

3.双向链表

#include "head.h"

/*
 * function:    双向链表创建
 * @param [ in] 
 * @param [out] 
 * @return      
 */
doublelink create_node(int flag)
{
doublelink L=(doublelink)malloc(sizeof(struct Node));
    if(NULL==L)return NULL;
    if(flag==1)
		L->len=0;
    else if(flag==0)
    	strcpy(L->data,"");//初始化数据域
	L->next=NULL;
	L->prev=NULL;
    return L;
}

/*
 * function:    双向链表头插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int insert_head(doublelink L,datatype e){
    if(NULL==L)return -1;
	doublelink s=create_node(0);
    if(s==NULL)return -1;
    //s的数据域赋值
    strcpy(s->data,e);
    //s的指针域
	s->next=L->next;
	s->prev=L;
    if(L->next!=NULL)
		L->next->prev=s;
    L->next=s;
    L->len++;
    return 0;
}

/*
 * function:    双向链表输出
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void output(doublelink L){
	if(NULL==L || NULL==L->next)return;
	puts("正向遍历");
	doublelink p=L;
	while(p->next!=NULL){
		p=p->next;
		printf("%s\t",p->data);
	}
	puts("");
	/*puts("逆向遍历");
	while(p->prev!=NULL){
		printf("%s\t",p->data);
		p=p->prev;
	}
	puts("");*/
}

/*
 * function:    双向链表尾插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
doublelink insert_rear(doublelink L,datatype e,doublelink rear){
	if(NULL==L)return NULL;
	doublelink s=create_node(0);
	if(s==NULL)return NULL;
	strcpy(s->data,e);
	rear->next=s;
	s->prev=rear;
	rear=s;
	L->len++;
	return rear;
}

/*
 * function:    头删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int delete_head(doublelink L){
	if(NULL==L ||NULL==L->next)return -1;
	doublelink q=L->next;
	L->next=q->next;
	if(q->next!=NULL)
		q->next->prev=L;
	free(q);
	q=NULL;
	L->len--;
	return 0;
}

/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int delete_rear(doublelink L){
	if(NULL==L ||NULL==L->next)return NULL;
	doublelink p=L;
	while(p->next!=NULL){
		p=p->next;
	}
	p->prev->next=NULL;
	free(p);
	p=NULL;
	L->len--;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值