建立一个链式线性表,并实现排序和插入数据
在敲这个代码时一直很纠结,逻辑上毫无错误,最后才发现是指针没学好。
在对尾部元素进行置空时,若想少定义指针去建立链表就必须要在循环中增加判断,否则当执行完h->next=h后再将h指向空并不代表h->next也指向空。
貌似蕴涵着一个哲学意义:此时的你并非彼时的你
#include <iostream>
#include<cstdlib>
using namespace std;
typedef struct v{
int e;
struct v *next;
int length;
}v;
v* initsq(){
struct v *sq;
sq=(struct v*)(malloc(sizeof(struct v)));
sq->next=NULL;
sq->length=0;
}
void insertsq(v *sq,int data){
v *p=(v*)(malloc(sizeof(v)));
p->e=data;
v *q=sq->next;
if(data<=q->e){
q->next=sq->next;
sq->next=q;
}
else{
int temp=q->next->e;//data必定>sq->next->e因此从p->next->e开始
while(data>temp&&q->next!=NULL){
q=q->next;
if(q->next)
temp=q->next->e;
}
p->next=q->next;
q->next=p;
}
sq->length++;
}
void sort(v* sq){
v* p=sq->next;
v* q;
while(p!=NULL){
q=p->next;
while(q!=NULL){
if(q->e<p->e){
int temp=p->e;
p->e=q->e;
q->e=temp;
}
q=q->next;
}
p=p->next;
}
}
void change(int *p,int *q){
int temp=*p;
*p=*q;
*q=temp;
}
void printsq(v *sq){
v* h=sq->next;
while(h!=NULL){
printf("%d ",h->e);
h=h->next;
}
printf("\n");
}
int main(int argc, char** argv) {
struct v *sq;
sq=initsq();
struct v *h=(v*)(malloc(sizeof(v)));
sq->next=h;
printf("input N:");
int n;
scanf("%d",&n);
while(n--){
scanf("%d",&h->e);
if(n==0)
break;
h->next=(v*)(malloc(sizeof(v)));
h=h->next;
}
h->next=NULL;
printsq(sq);
sort(sq);
printsq(sq);
printf("insert number:");
int data;
scanf("%d",&data);
insertsq(sq,data);
printsq(sq);
printf("\nlength=%d",&sq->length);
return 0;
}