//线性表结构体定义
//顺序表定义
typedef struct{
int data[maxsize];
int length;
}sqlist;
//单链表定义
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
//双链表定义
typedef struct DLNode{
int data;
struct LNode *prior;
struct LNode *next;
}DLNode;
//顺序表
//按元素值的查找算法
int findelem(sqlist L,int e){ //查找e
int i;
for(i=0;i<L.length;++i)
if (e==L.data[i])
return i;
return -1;
}
//插入元素
int insertelem(sqlist &L,int p,in e) //在L中的p位置插入元素e
{
int i;
if(p<0||p>L.length||L.length==maxsize)
return 0;
for(i=L.length-1;i>=p;--i)
L.data[i+1]=L.data[i]; //元素后移
L.data[p]=e;
++(L.length);
return 1;
}
//删除元素
int deleteElem(sqlist &L, int p, int &e) //删除p位置上的元素 e得到被删除元素的值
{
int i;
if(p<0||p>L.length-1)
return 0;
e=L.data[p];
for(i=p;i<L.length-1;++i)
L.data[i]=L.data[i+1];
--(L.length);
return 1;
}
//归并
void mergearray(int a[],int m, int b[],int n, int c[]) {
int i=0,j=0;
int k=0;
while (i<m&&j<n){
if(a[i]<b[j])
c[k++]=a[i++];
else
c[k++]=b[j++];
}
while(i<m)
c[k++]=a[i++];
while(j<n)
c[k++]=b[j++];
}
//单链表的操作
//插入
s->next=p->next;
p->next=s;
//删除
q=p->next;
p->next=p->next->next;
free(q);
//尾插法 比头插法多一个辅助指针
void creatlistR(LNode *&head){
LNode *p=NULL,*r; //p用来增加结点 r用来辅助
head=(LNode*)malloc(sizeof(LNode));
head->next=NULL; //带头结点的链表
r=head;
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
p=(LNode*)malloc(sizeof(LNode));
p->next=NULL; //注意这里和书上的区别 因为这里=NULL了 循环结束以后不需要额外加=NULL
scanf("%d",&(p->data));
p->next=r->next;
r->next=p;
r=p;
}
}
//头插法 结果是逆序
void creatlistH(LNode *&head){
LNode *p=NULL;//*r; 无需辅助指针
head=(LNode*)malloc(sizeof(LNode));
head->next=NULL;
r=head;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
p=(LNode*)malloc(sizeof(LNode));
p->next=NULL;
scanf("%d",&(p->data));
p->next=head->next;
head->next=p;
}
}
//归并算法
//尾插法归并
void merge(LNode *A,LNode *B,LNode *&C){
LNode *p=A->next;
LNode *q=B->next; //pq跟踪AB中最小值
LNode *r; //尾插法需要一个辅助指针
//对A头结点的废物利用
c=A;
c->next=NULL;
free(B);
r=c;
while(p!=NULL&&q!=NULL){
if(p->data<=q->data){
r->next=p;p=p->next;
r=r->next;
}else{
r->next=q;q=q->next;
r=r->next;
}
}
r->next=NULL; //其实可去掉
if(p!=NULL){
r->next=p;
}
if(q!=NULL){
r->next=q;
}
}
//头插法归并 得到逆序归并
void mergeR(LNode *A,LNode *B,LNode *&C){
LNode *p=A->next;
LNode *q=B->next; //pq跟踪AB中最小值
LNode *s; //这里s似乎不是必要的吧 视频说是取下并入的结点 后期复习可以运行下
//对A头结点的废物利用
c=A;
c->next=NULL;
free(B);
while(p!=NULL&&q!=NULL){
if(p->data<=q->data){
s=p;p=p->next;
s->next=c->next;
c->next=s;
}else{
s=q;q=q->next;
s->next=c->next;
c->next=s;
}
}
//和前面不同的地方
while(p!=NULL){
s=p;
p=p->next;
s->next=c->next;
c-next=s;
}
while(q!=NULL){
s=q;
p=q->next;
s->next=c->next;
c-next=s;
}
}
//双链表的操作
//尾插法建立双链表
void createDlistR(DLNode *&L,int a[], int n){
DLNode *s,*r;
L=(DLNode *)malloc(sizeof(DLNode)) ;
L->prior=NULL;
L->next=NULL;
r=L;
for(int i;i<n;++i) {
s=(DLNode*)malloc(sizeof(DLNode));
s->data=a[i];
r->next=s;
s->prior=r;
r=s;
}
r->next=NULL;
}
//查找结点的算法
DLNode *findnode(DLNode *c,int x){ //查找第一个值为x的结点
DLNode *p=c->next;
while(p!=NULL){
if(p->data==x)
break;
p=p->next;
}
return p;
}
//插入结点
s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;
//删除节点
q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
数据结构高分笔记-线性表代码
猜你喜欢
转载自blog.csdn.net/dreampinguo/article/details/82291321
今日推荐
周排行