一、递增有序表插入(顺序表)
//递增有序表插入
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define OK 1
#define Error 0
typedef struct{
int *elem; //存储空间基址
int length; //顺序表的当前长度
int listsize; //当前分配的存储容量
}SqList;
//初始化顺序表
void InitList(SqList &L){
L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int)); //用malloc申请一片连续的存储空间
L.length = 0; //空表长度为0
L.listsize = LIST_INIT_SIZE; //初始存储容量
}
//递增有序表插入
void ListInsert_Sq(SqList &L,int e){
int i=0;
if(L.length>=L.listsize){ //当前存储空间已满,增加分配
int *newbase=(int *)malloc((L.listsize+LISTINCREMENT)*sizeof(int)); //存储分配
if(!newbase) return; //存储分配失败
L.elem=newbase; //新基址
L.listsize=L.listsize+LISTINCREMENT; //增加存储容量
free(newbase); //释放内存
}
for(i=L.length;i>0&&L.elem[i-1]>e;i--){
L.elem[i]=L.elem[i-1]; //插入位置及之后的元素后移
}
L.elem[i]=e; //插入元素e
L.length++; //表增长1
}
int main(){
SqList L; //声明一个顺序表
InitList(L); //初始化顺序表
ListInsert_Sq(L,1); //插入元素
ListInsert_Sq(L,9);
ListInsert_Sq(L,91);
ListInsert_Sq(L,2);
ListInsert_Sq(L,3);
ListInsert_Sq(L,6);
ListInsert_Sq(L,10);
ListInsert_Sq(L,2);
for(int m=0;m<L.length;m++){
printf("%d\n",L.elem[m]); //打印查找的元素
}
return 0;
}
二、单链表重复结点删除
//单链表重复结点删除
#include <stdio.h>
#include <stdlib.h> //malloc、free函数的头文件
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L == NULL) return false; //内存不足分配失败
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList &L, int i, int e){
if(i<1) return false; //i值不合法
LNode *p; //指针p,指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点
while(p!=NULL && j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false; //i值不合法
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data = e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true; //插入成功
}
//带头结点无序单链表L,删除表中相同元素
void Delete(LinkList &L){
LNode *p=L->next; //p指向第一个结点
LNode *q,*pre,*t;
while(p){
pre=p; //q的前驱结点pre
q=p->next;
while(q){ //查找链表中有无和p值相同的结点
if(p->data!=q->data){
q=q->next;
pre=pre->next;
}
else{ //找到则删除
t=q;
q=q->next;
pre->next=q;
free(t);
}
}
p=p->next; //继续判断下一个结点
}
}
int main(){
LinkList L; //声明一个单链表的指针
InitList(L); //初始化单链表
ListInsert(L,1,11); //插入
ListInsert(L,2,12);
ListInsert(L,3,13);
ListInsert(L,4,14);
ListInsert(L,5,12);
ListInsert(L,6,16);
ListInsert(L,7,13);
ListInsert(L,8,17);
Delete(L); //删除重复元素
//打印数据
L=L->next;
while(L!=NULL){
printf("%d\n",L->data);
L=L->next;
}
return 0;
}