建立一个升序链表并遍历输出

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;
}

 

更多推荐