数据结构(c++)写法
单链表的建立
例题1:合并链表
将两个链表表示的递增整数序列合并为一个非递减的整数序列。
输入以-1 作为结束
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 typedef struct LNode *List; 5 struct LNode 6 { 7 int data; 8 LNode *next; 9 }; 10 11 void InitList(List &L) 12 { 13 L = new LNode; 14 L->next = NULL; 15 } 16 17 void CreatList(List &L) 18 { 19 List r,s; 20 s = L; 21 int a; 22 while(1) 23 { 24 cin >> a; //输出以-1作为结束 25 if(a == -1) //尾插法 26 break; 27 r = new LNode; 28 r->data = a; 29 r->next =NULL; 30 s->next = r; 31 s = r; 32 } 33 s->next = NULL; 34 } 35 36 void PrintList(List &L) 37 { 38 List p; 39 p = L->next; 40 while(p) 41 { 42 cout << p->data << " "; 43 p = p->next; 44 } 45 } 46 47 void mergeList(List &L1,List &L2) 48 { 49 List pa,pb,pc,lc; 50 pa = L1->next; 51 pb = L2->next; 52 lc = new LNode; //新建头结点 53 pc = lc; // pc指向 lc 54 while(pa&&pb) 55 { 56 if(pa->data <= pb->data) 57 { 58 pc->next = pa; 59 pc = pa; 60 pa = pa->next; 61 } 62 else 63 { 64 pc->next = pb; 65 pc = pb; 66 pb = pb->next; 67 } 68 } 69 pc->next = pa?pa:pb;// 将pa或pb 没有遍历完的串 串入pc 70 free(L1); //释放掉L1,L2 71 free(L2); //如果要输出NULL 则 L1->NULL 72 PrintList(lc); 73 } 74 75 int main() 76 { 77 List a,b; 78 InitList(a); 79 CreatList(a); 80 InitList(b); 81 CreatList(b); 82 mergeList(a,b); 83 return 0; 84 85 }
运行结果
总结
1.每个链表都有一个头节点,该头节点数据无意义,只有指向下一节点的指针有效。
2.List L=new LNode代表了一个链表,L为指向头节点的指针
3.通常对链表的操作通过新创建一个指针p=L来操作链表的增删查找(头指针代表一个链表,其值不能改变)。
单链表的新发现
:对已经遍历完 指向 NULL 的指针无法再进行操作。
此处a已经指向NULL,若再遍历则会cpu报错。
例题2:一元多项式的乘法与加法运算
题目来源:https://www.cnblogs.com/yuxiaoba/p/8326018.html
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
题意理解
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 typedef struct LNode *List; 5 struct LNode 6 { 7 int m; //用两个结点来储存 8 int n; 9 LNode *next; 10 }; 11 12 void InitList(List &L) 13 { 14 L = new LNode; 15 L->next =NULL; 16 } 17 18 void CreatList(List &L) 19 { 20 List p,s; 21 s = L; 22 int n; 23 cin >> n; 24 for(int i = 0; i < n; i++) 25 { 26 p = new LNode; 27 cin >> p->m >> p->n; 28 p->next = NULL; 29 s->next = p; 30 s = p; 31 } 32 s->next = NULL; 33 } 34 35 void PrintList(List &L) 36 { 37 List p; 38 p = L->next; 39 if(p == NULL) 40 { 41 cout << "0 0"; 42 } 43 while(p) 44 { 45 cout << p->m <<" " << p->n << " "; 46 p = p->next; 47 } 48 cout << endl; 49 } 50 51 void MultiList(List &L1,List &L2) // 将两个多项式相乘 52 { 53 List a,b,c,c2,c3,lc; 54 a = L1->next; 55 b = L2->next; 56 lc = new LNode; 57 c2 = lc; 58 while(b) //先将L1的第一项与L2每个都相乘 形成初始链表 59 { 60 c = new LNode; 61 c->m = a->m * b->m; 62 c->n = a->n + b->n; 63 c->next = NULL; 64 c2->next = c; 65 c2 = c; 66 b = b->next; 67 } 68 b = L2->next; 69 a = L1->next->next; 70 71 while(a) //再从L1的第二个与L2每个相乘 72 { 73 b = L2->next; //别忘记 遍历完b后归位 74 while(b) 75 { 76 c2 = lc; 77 c3 = lc->next; 78 c = new LNode; 79 c->m = a->m * b->m; 80 c->n = a->n + b->n; 81 while(c3) //将新结点与初始链表比较 82 { 83 if(c3->n < c->n) //若新结点的幂大于任意一结点则插入 84 { 85 c2->next = c; 86 c->next = c3; 87 break; 88 } 89 else if(c3->n == c->n) 90 { 91 c3->m = c->m + c3->m; 92 if((!c3->m)) //若c3->m == 0 则要删除结点 否则内存泄漏 93 { 94 c2->next = c3->next; 95 free(c3); 96 } 97 free(c); 98 break; 99 } 100 c2 = c2->next; 101 c3 = c3->next; 102 } 103 if(!c3) 104 { 105 c2->next = c; // c3此遍历到NULL,用前一个阶段C2做插入操作 106 c->next = NULL; 107 } 108 b = b->next; 109 } 110 a = a->next; 111 } 112 PrintList(lc); 113 } 114 void addList(List &L1,List &L2) 115 { 116 List a,b,c,c2,lc; 117 a = L1->next; 118 b = L2->next; 119 lc = new LNode; 120 c2 = lc; 121 while(a && b) 122 { 123 c = new LNode; 124 if(a->n > b->n) 125 { 126 c->m = a->m; 127 c->n = a->n; 128 c->next = NULL; 129 c2->next = c; 130 c2 = c; 131 a = a->next; 132 } 133 else if(a->n == b->n) 134 { 135 c->m = a->m + b->m; 136 c->n = a->n; 137 if(!(c->m)) 138 { 139 free(c); //不free则造成内存泄漏 140 a = a->next; 141 b = b->next; 142 continue; 143 } 144 c2->next = c; 145 c2 = c; 146 a = a->next; 147 b = b->next; 148 } 149 else if(a->n < b->n) 150 { 151 c->m = b->m; 152 c->n = b->n; 153 c->next = NULL; 154 c2->next = c; 155 c2 = c; 156 b = b->next; 157 } 158 } 159 c2->next = a?a:b; //因为按幂的递减,将a或b未连接的串入 160 PrintList(lc); 161 } 162 int main () 163 { 164 List a,b; 165 InitList(a); 166 CreatList(a); 167 InitList(b); 168 CreatList(b); 169 MultiList(a,b); 170 addList(a,b); 171 }
输出结果