1.顺序表的结构体定义
//顺序表
typedef struct{
int data[maxsize];
int length;
}SqList;
//单链表
typedef struct{
int data;
struct LNode *next;
}LNode;
//双链表
typedef struct DLNode
{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLNode;
2.顺序表常见操作
//按元素值查找算法
int findElem(SQList L,int 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,int 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)
{
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;
}
3.单链表的操作
//尾插法建表
void createListR(LNode &L,int a[],int n)
{
LNode *s,*r;
int i;
C=(LNode*)malloc(sizeof(LNode));
C->next=NULL;
r=C;
for(i=0;i<n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
r->next=s;
r=r->next;
}
r->next=NULL;
}
//尾插法建表
void createList(LNode *&C,int a[],int n)
{
LNode *s;
int i;
C=(LNode*)malloc(sizeof(LNode));
C->next=NULL;
for(int i=0;i<n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
s->next=C->next;
C->next=s;
}
}
//A,B两个单链表递增有序,将A和B归并成非递减有序C
void merge(LNode *A,LNode *B,LNode *&C)
{
LNode *p=A->next;LNode *q=B->next;
LNode *r;
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;
}
}
if(p!=NULL)
r->next=p;
if(q!=NULL)
r->next=q;
}
//A,B两个单链表递增有序,将A和B归并成非递增有序C
void merge(LNode *A,LNode *B,LNode *&C)
{
LNode *p=A->next;LNode *q=B->next;
LNode *s;
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;q=q->next;s->next=c->next;c->next=s;
}
}
//查找链表C中值为x的结点,若存在,则删除
int findAndDelete(LNode *C,int x)
{
LNode *p,*q;
LNode *pre;
p=c->next;pre=C;
while(p!=NULL)
{
if(p->data==x)
{
pre=p;
break;
}
p=p->next;
}
if(p==NULL)
return 0;
else
{
pre->next=p->next;
free(p);
}
}
4.双链表的操作
//采用尾插法
void createDistR(DLNode *&L,int a[],int n)
{
DLNode *s,*r;
int i;
L=(DLNode *)malloc(sizeof(DLNode));
L->prior=NULL;L->next=NULL;
r=L;
for(i=0;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)
{
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);
1417



被折叠的 条评论
为什么被折叠?



