数据结构 第二章 线性表

单链表上的操作

CreatList函数:

Node* CreatList_L() {
	Node*head = (Node*)malloc(sizeof(Node)); head->next = NULL;//创建头结点
	Node* p = head;
	int a;	cin >> a;
	while(a!=-1) {
		Node *q= (Node*)malloc(sizeof(Node));//给q分配空间
		p->next = q; //前一个结点连向后一个
		q->data = a; q->next = NULL;//填入数据域,指针域赋空
	    p = q;//更新p位置
		cin >> a;
	}
	return head;
}

主函数:

int main()
{
	Node* head = CreatList_L();
	return 0;
}

GetElem_L函数:

void GetElem_L(Node* head, int i, int& e) {//取第i个位置元素的值
	Node* p = head->next; int j = 1;//j为计数器
	while (p && j < i) {//p指向第i个元素
		p = p->next; j++;
	}
	e = p->data;
}

ListInsert_L函数:

void ListInsert_L(Node* head, int i, int e) {//在第i个位置前插入e
	Node* p = head; int j = 0;
	while (p && j < i - 1) {//寻找第i-1个结点
		p = p->next; j++;
	}
	Node*s = (Node*)malloc(sizeof(Node));
	s->data = e; 
	s->next = p->next; p->next = s;//先修改p->next结点
}

ListDelete_L函数:

void ListDelete_L(Node* head, int i, int& e) {
	Node* p = head; int j = 0;
	while (p->next && j < i - 1) {//找第i个结点,令p指向其前驱
		p = p->next; j++;
	}
	Node*q = p->next; p->next = q->next;
	e = q->data; free(q);
}

PrintList_L函数:

void PrintList_L(Node* head) {
	Node* p = head->next;
	while (p) {
		cout << p->data << ' ';
		p = p->next;
	}
}

MergeList_L函数: 非递减链表A、B归并为非递减链表C
思想:不需另建新的结点空间,只需将原来链表中结点间关系解除,重新按非递减关系链接

void MergeList_L(Node* head_a, Node* head_b) {
	Node* pa = head_a->next, * pb = head_b->next;
	Node*head_c = head_a;Node* pc = head_c;//head_c与head_a等价
	while (pa && pb) {
		if (pa->data <= pb->data) {//直接将pa连到pc后
			pc->next = pa; pc = pa; pa = pa->next;
		}
		else {
			pc->next = pb; pc = pb; pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;//插入剩余段
	free(head_b);//释放head_b
}

difference函数: 计算(A-B)∪(B-A)
思路:需另建空间

Node* difference(Node* head_a, Node* head_b) {
	Node* pa = head_a->next;
	Node* head_c = (Node*)malloc(sizeof(Node)); head_c->next = NULL;
	Node* pc = head_c;
	while (pa) {
		int find = 0;
		Node* pb = head_b->next;//pb重新指向头
		while (pb) {
			if (pa->data == pb->data) {
				find = 1; break;
			}
			pb = pb->next;
		}
		if (find == 0) {//得到A-B接到c末尾,新建空间
			Node*qc = (Node*)malloc(sizeof(Node));
			pc->next = qc;
			qc->data = pa->data; qc->next = NULL;
			pc = qc;
		}
		pa = pa->next;
	}
	Node* pb = head_b->next;
	while (pb) {
		int find = 0;
		Node* pa = head_a->next;
		while (pa) {
			if (pa->data == pb->data) {
				find = 1; break;
			}
			pa = pa->next;
		}
		if (find == 0) {//得到A-B接到c末尾,新建空间
			Node* qc = (Node*)malloc(sizeof(Node));
			pc->next = qc;
			qc->data = pb->data; qc->next = NULL;
			pc = qc;
		}
		pb = pb->next;
	}
	return head_c;
}

CreatPolyn函数:

Node* CreatPolyn() {
	Node* head = (Node*)malloc(sizeof(Node)); head->next = NULL;
	Node* p = head;
	double d; int e; 
	int n; cin >> n;//依次输入n个非零项
	for (int i = 1; i <= n; i++) {
		cin >> d >> e;
		Node* q = (Node*)malloc(sizeof(Node));
		p->next = q;
		q->coef = d; q->expn = e; q->next = NULL;
		p = q;
	}
	return head;
}

**PrintPolyn函数:**打印多项式

void PrintPolyn(Node* head) {
	Node* p = head->next;
	while (p) {
		cout << p->coef << "*x^" << p->expn << ' ';
		p = p->next;
	}
	cout << endl;
}

AddPolyn函数: 一元多项式相加

void Addpolyn(Node* head_a, Node* head_b) {
	Node* pa=head_a,*qa = head_a->next, * qb = head_b->next;
	while (qa && qb) {
		if (qa->expn < qb->expn) {
			pa->next = qa; pa = qa;
			qa = qa->next;
		}
		else if (qa->expn > qb->expn) {
			pa->next = qb; pa = qb;
			qb = qb->next;
		}
		else {//指数相等
			if (qa->coef + qb->coef != 0) {//系数和!=0
				qa->coef += qb->coef; pa->next = qa;
				pa = qa;
			}
			qa = qa->next; qb = qb->next;
		}
	}
	pa->next = NULL;//尾赋空
	if (qa != NULL) pa->next = qa;
	if (qb != NULL) pa->next = qb;
	free(head_b);
}

MultiPolyn函数: 利用AddPolyn函数实现(debug中)

Node* MultiPolyn(Node* head_a, Node* head_b) {
	Node* head_c = (Node*)malloc(sizeof(Node)), *head_d = (Node*)malloc(sizeof(Node));//c存和,d存加数
	head_c->next = NULL; head_d->next = NULL;
	Node* pb = head_b->next;
	while(pb){
		Node* qa = head_a->next, * pd = head_d;
		while (qa) {
			Node* qd = (Node*)malloc(sizeof(Node));
			qd->coef = (qa->coef) * (pb->coef); qd->expn = qa->expn + pb->expn; qd->next = NULL;
			pd->next = qd; pd = qd;
			qa = qa->next;
		}
		//PrintPolyn(head_d);
		AddPolyn(head_c, head_d);
		//PrintPolyn(head_c);
		pb = pb->next;
	}
	return head_c;
}
发布了99 篇原创文章 · 获赞 44 · 访问量 5523

猜你喜欢

转载自blog.csdn.net/weixin_44413191/article/details/103098795