单链表上的操作
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;
}