1.尾插法建立单链表
假设有n个元素已经存储在数组a中,用尾插法建立链表C:
void createlistR(LNode *&C, int a[], int n)
{
LNode *s, *r; //s用来指向新申请的结点,r始终指向C的终端结点
int i;
C=(LNode *) malloc (sizeof(LNode)); //申请C的头结点空间
C->next=NULL;
r=c; //r指向头结点,因为此时头结点就是终端结点
for (i=0; i<n; ++i) //循环申请n个结点来接收数组a中的元素
{
s=(LNode*) malloc (sizeof(LNode)); //s指向新申请的结点
s->data = a[i]; //用新申请的结点来接收a中的一个元素
r->next = s; //用r来接纳新结点
r = r->next; //r指向终端结点,以便于接纳下一个到来的结点
}
r->next = NULL; //C建立完成
}
2.头插法建立单链表
void createlistR(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; //s所指新结点的指针域next指向C中的开始结点
C->next = s; //头结点的指针域next指向s结点,使得s成为新的开始结点
}
}
3.单链表结点的删除操作
删除操作除了修改指针之外,还需要释放所删除结点的内存空间
q = p->next;
p->next = p->next->next;
free(q);
4.单链表的查找操作
查找链表C(带头结点)中是否存在一个值为x的结点,若存在,则删除该结点并返回1,否则返回0:
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 = p->next->next;
free(q);
return 1;
}
}
5.采用尾插法建立双链表
void createDlistR(DLNode *&L, int a[], int n)
{
LNode *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;
}
6.双链表插入结点算法
s->next = p->next;
s->prior = p;
p->next = s;
s->next->prior = s; //若p指向最后一个结点,则本行可去
7.双链表查找结点算法
DLNode* findNode (DLNode *C, int x)
{
DLNode *p = C->next;
while (p != NULL)
{
if (p->data == x)
break;
p = p->next;
}
return p;
}
8.双链表删除结点算法
q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);