链表的使用方法
链表是我们日常编程中最常见到的一种数据结构,链表单个节点的定义如下所示
struct Node{
int Data; //最基本的数据元素
Node *next; //向下扩展的指针节点
};
下面我们通过链表的尾插法来学习使用链表
首先我们需要读取数据
//读取数据
Node* readData(int length){
Node* head = new Node;
Node* p = head;
int data;
for(int i=0;i<length;i++){
scanf("%d", &data);
p->Data = data;
p->next = new Node;
p = p->next;
}
p->next = NULL;
return head;
}
其次我们需要时刻获取链表的长度
//返回数据长度
int mDataLength(Node* p){
int length = 0;
while (p->next != NULL) {
p = p->next;
length++;
}
return length;
}
链表尾插的基本思路
//链表尾插法
Node* insertToTail(Node* Primary,Node* insertData){
Node* p = Primary;
int length = mDataLength(p);
for(int i=0;i<length-1;i++){
Primary = Primary->next;
}
Primary->next = insertData;
return p;
}
排序的方法
/**
*@排序
*@param flag
*1 升序
*0 降序
**/
Node* sortData(Node* head,bool flag){
Node* p = head;
Node* q = p;
int length = mDataLength(head);
int data[length];
int len0 = 0,len1 = 0;
while(head->next!=NULL){
data[len0++] = head->Data;
head = head->next;
}
for(int i=0;i<length;i++){
for(int j=i+1;j<length;j++){
if(data[i]>data[j]){
int temp;
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
switch(flag){
case 1:{
while(p->next != NULL){
p->Data = data[len1++];
p = p->next;
}
break;
}
case 0:{
length = length-1;
while(p->next != NULL){
p->Data = data[length--];
p = p->next;
break;
}
}
}
return q;
}
打印数据的方法
//打印数据
void printData(Node* head){
Node* p = head;
while (p->next != NULL) {
printf("%d\n", p->Data);
p = p->next;
}
}
主函数
int main(){
Node *a,*b,*c;
int a_length,b_length,c_length;
//读取a,b,c的数据
scanf("%d%d%d", &a_length,&b_length, &c_length);
a = readData(a_length);
b = readData(b_length);
c = readData(c_length);
//将a,b的数据插入到c
c = insertToTail(c,a);
c = insertToTail(c,b);
//排序
sortData(c,1);
//打印
printData(c);
}
这样一个完整的尾插法就结束了