一: 线性表结构定义:
#define maxSize 100
1)顺序表结构体定义:
typedef struct{
int data[maxSize];
int length;
}Sqlist;
2)单链表节点定义
typedef struct {
int data;
struct LNode *next;
}Lnode;
3)双链表节点定义
typedef struct{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLNoed;
二: 线性表基本操作:
1)顺序表的操作
//初始化顺序表
void initList(Sqlist &L){
L.length=0;
}
//求指定位置元素
int getElem(Sqlist L,int p,int &e){
if(p<0||p>L.length)return 0;
e=L.data[p];
return 1;
}
//按元素值查找算法
void findElem(Sqlist L,int e){
int i;
for(int 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;
}
//删除下标为p的元素
int deleteElem(Sqlist &L,int p,int &e){
int i;
if(p<0||p>L.length)return 0;
e=L.length[p];
for(i=0;i<L.length-1;i++){
L.data[i]=L.data[i+1];
L.length--;
return 1;
}
}
2)单链表的操作
//尾插法建立单链表
void createlistR(LNode *&C,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 createlistF(LNode *&C, int a[],int n){
LNode *s;
int i;
C=(LNode *)malloc(sizeof(LNode));
C->next=NULL:
for(i=0;i<n;i++){
s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];
s->next=C->next;
C-next=s;
}
}
//查找并删除一个节点
int findAndDelete(Lnode *C,int x){
LNode *p.*q;
p=C;
while(p->next!=NULL){
if(p->next->data==x)break;
p=p->next;
}
if(p->next==NULL){
return 0;
}
else{
q=p->next;
p->next=q->next;
free(q);
return 1;
}
}
//两个链表递增链表AB合并成一个递增链表C(头插法)
void merge1(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;
}
}
r->next=NULL;
if(p!=NULL)r->next=p;
if(q!=NULL)r->next=q;
}
//两个递增链表AB合并成一个递减链表C(尾插法)
void merge2(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){
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;
}
}
3)双链表的操作
//查找结点
DLNode* findNode(DLNode *C,int x){
DLNode *p=C->next;
while(p!=NULL){
if(p->data==x)break;
p=p->next;
}
return p;
}
//p所指节点之后插入节点插入s
int insertNode(DLNode *&C,DLNode *p,int e){
DLNode *s=(DLNode *)malloc(sizeof(DLNode));
s->data=e;
s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;
return 1;
}
//删除p节点的后继节点
int deleteNode(DLNode *&C,DLNode *p){
DLNode *q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
return 1;
}