建立一个链式线性表

建立一个链式线性表,并实现排序和插入数据

在敲这个代码时一直很纠结,逻辑上毫无错误,最后才发现是指针没学好。

在对尾部元素进行置空时,若想少定义指针去建立链表就必须要在循环中增加判断,否则当执行完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;
}

猜你喜欢

转载自blog.csdn.net/qq_40933929/article/details/84891159