一、顺序表
顺序表结构体定义:
typedef struct {
int data[maxSize]; // #define maxSize 100
int length;
}Sqlist;
常见定义:
int data[maxsize];
顺序表操作:
插入数据元素:
在顺序表的p位置插入新数据元素x,成功返回1,不成功返回0:
int insertElem( Sqlist &L,int p,int x ){
if( p<0 || p>L.length || L.length==maxSize )
return 0;
for( int i = L.length-1; i>=p; i-- )
L.data[i+1] = L.data[i];
L.data[p] = x;
++(L.length);
return 1;
}
查找数据元素值:
按照元素值查找返回下标
int findElem( Sqlist L ,int x ){
for( int i = 0;i<L.length;i++ ){
if( L.data[i]==x )
return i;
}
return -1; // 没找到,返回-1标记
}
删除数据元素:
删除下标为p 的数据 成功返回1,失败返回0;将被删除元素赋给x.
int deleteElem( Sqlist &L , int p , int &x){
if( p<0 || p>length-1) return 0 ;
x = L.data[p];
for( int i = p; i<L.length-1; i++ )
L.data[i] = L.data[i+1];
--(L.length);
return 1;
}
二、链表
1.单链表
单链表节点定义:
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
尾插法建立单链表:
void createlistR(LNode *& c , int a[] ,int n){
LNode *p, *q;
c = (LNode *)malloc(sizeof(LNode));
c->next = NULL;
q = c;
for( int i = 0 ; i<n ; i++){
p = (LNode *)malloc(sizeof(LNode));
p->data = a[i];
q->next = p;
q = q->next;
}
q->next = NULL;
}
头插法建立单链表:
void createlistF(LNode *&c ,int a[] ,int n){
LNode *p ;
c = (LNode *)malloc(sizeof(LNode));
c->next = NULL;
for ( int i = 0;i<n;i++){
p = (LNode *)malloc(sizeof(LNode));
p->data = a[i];
p->next = c->next;
c->next = p;
}
}
头插法建立单链表:
2.双链表
双链表节点定义:
typedef struct DLNode{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLNode;
采用尾插法建立双链表:
void createDlistR( DLNode *&L ,int a[] ,int n){
DLNode *p,*q;
L = (DLNode *)malloc(sizeof(DLNode));
L->next = NULL;
L->prior =NULL;
p = L;
for( int i = 0; i<n ; i++){
q = (DLNode *)malloc(sizeof(DLNode));
q->data = a[i];
q->prior = p;
p->next = q;
p = p->next;
}
p->next = NULL;
}
查找节点:
查找值为x的节点返回节点指针:
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节点:
s->next = p->next;
s->prior = p;
p->next = s;
s->next->prior = s;
删除结点:
删除双链表p的后继节点:
q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);