算法笔记--链表遍历
·
建立一个升序链表并遍历输出
1.单链表结点定义
typedef struct LNode{
int data;
struct LNode *next;
};
2.假设有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; //数组a中所有的元素都已经装入链表C中,C的终端
//结点的指针域置为NULL,C建立完成
}
3.打印链表中的数据
void print(LNode *head){
head = head->next;
while(head!=NULL){
cout<<head->data<<" ";
head=head->next;
}
cout<<endl;
}

思路一:先将数据排好序,利用尾插法依次插入到链表中
思路二:边判断边插入
思路一代码:
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
};
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;//数组a中所有的元素都已经装入链表C中,C的终端
//结点的指针域置为NULL,C建立完成
}
void print(LNode *head){
head = head->next;
while(head!=NULL){
cout<<head->data<<" ";
head=head->next;
}
cout<<endl;
}
int main(){
int n;
int a[1000];
LNode *head = (LNode*)malloc(sizeof(LNode));
head->next = NULL;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
createlistR(head,a,n);
print(head);
}
return 0;
}
思路二部分代码:
void insertNode(LNode *head , int data) {
LNode *p = head;
while (p->next != NULL && p->next->data < data) {
p = p->next;
}
LNode *temp = (LNode*)malloc(sizeof(LNode));
temp->data = data;
temp->next = p->next;
p->next = temp;
}
更多推荐



所有评论(0)