单链表结点定义
//单链表结点定义
typedef struct LNode{
int data; //data中存放结点数据域(以int类型为例)
struct LNode *next; //指向后继结点的指针
}LNode; //定义单链表结点类型
单链表的操作
//尾插法创建单链表
/*
+------+--------+-----------+
|头结点 |原有结点 |新节点的位置 |
+------+--------+-----------+
*/
void createlistR(LNode *&C, int a[], int n){
LNode *s, *r; //s用来指向申请的结点,r始终指向C的终端结点
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 = r->next; //r指向尾结点,方便连接下一个结点
}
r->next = NULL; //C的尾结点指针域置为NULL,C建立完成
}
//头插法创建单链表
/*
+------+-----------+--------+
|头结点 |新节点的位置 |原有结点 |
+------+-----------+--------+
*/
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; //s指向新节点的之争与next指向C中的开始结点
C->next = s; //头结点的指针域next指向s结点,使得s称为新的开始结点
}
}
//两递增单链表归并成一个递增单链表
void mergeListtoIncreasing(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;
}
//两递增单链表归并成递减的单链表的算法
void mergeListtoDesending(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;
}
}
//查找并删除结点
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;
}
}
注:
在定义函数的时候,C语言的函数形参不能为定义如下:
void func(int &a)
,也就是C语言不支持定义引用类型的形参,但是C++是支持的。在C语言如果想要传引用类型的参数,需要在传实参的时候加上‘&’符号,如:func(&a);
,使用C++,可以使得调用函数时更加方便。 在测试上述代码时要将文件扩展名改为.cpp