数据结构(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 }
多项式相加和相乘

 

 

输出结果

 

 

 

 

 

转载于:https://www.cnblogs.com/invokerrr/p/11503098.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值