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;
}