单链表可以做什么的存储
① 数据结构c语言 用单链表储存一元多项式,并实现两个多项式的相加运算(语法没有错误)可能指针错了
void Add(LinkList *P1,LinkList *P2,LinkList *&P3)里面的算法有点问题!
我依照你的算法,补充了一下程序!里面新编写了一个函数void CopyList(LinkList * a,LinkList *b) ;
同时void Add(LinkList *P1,LinkList *P2,LinkList *&P3做了一点修改!也许,程序的可读性不好,你可以自己再修改!代码如下:
#include<stdio.h>
#include <malloc.h>
#define MAX 20 //多项式最多项数
typedef struct{
double ratio;
int exp;
} ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n)
{ LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for (i=0;i<n;i++)
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
/*
将一个链表的部分或全部结点复制到另一个链表中,
a是新链表的最后一个结点,b是被复制链表的某一结点
即让要复制的结点加到新链表的尾部*/
void CopyList(LinkList * a,LinkList *b) //
{
LinkList *temp,*last; //temp临时指针,last指向新链表的最后一个结点
last=a;
/*循环体中实现从结点b开始到链表结束,将各结点复制到新链表中*/
while(b!=NULL)
{
temp=(LinkList *)malloc(sizeof(LinkList)); //新建一个结点
temp->data=b->data; //将链表当前要复制的结点b复制到新结点中
last->next=temp; //将新建的结点加到新链表的末端
last=temp; //last指向尾结点,刚才新建的结点已成为新链表的尾结点
b=b->next; //遍历链表的下一个结点b
}
last->next=NULL; //新链表尾结点中next指针的值设为NULL,即新链表创建完成
}
void DestroyList(LinkList *&L) //销毁链表
{
LinkList *pre =L, *p=L->next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
void DispList(LinkList *L)
{ LinkList *p=L->next;
while (p!=NULL)
{ printf("%fx^%d ",p->data.ratio,p->data.exp);
p=p->next;
}
printf("\n");
}
void Add(LinkList *P1,LinkList *P2,LinkList *&P3)
{ LinkList *p=P1->next,*q=P2->next;
LinkList *head; //链表P3的头指针
head=(LinkList *)malloc(sizeof(LinkList)); //新建头结点
P3=head;
int i;
for (i = 0; i<MAX; i++)
{
P1=(LinkList *)malloc(sizeof(LinkList)); //新建一个结点
P3->next=P1; //将新建的结点加到合并后链表中
P3=P1;
/*注意这里是'<',链表的结点已经从小到大排列有序,
每次比较都选择较小的结点加到合并后的链表P3中*/
if ((p->data.exp)<(q->data.exp))
{
P3->data.exp = p->data.exp;
P3->data.ratio = p->data.ratio;
if (p->next!=NULL) //如果链表P1的下一个结点存在,则遍历下一个结点
p = p->next;
else //否则,将另一个链表P2剩余的结点加到链表P3中,链表P3建立完成
{
CopyList(P3,q);
break;
}
}
/*下面其他两种情况的处理都是同一个道理,
在比较过程中,只要其中一个链表的所有结点都遍历了,
此时只需要将另一个链表的剩余结点都加到P3中,就可以完成链表的合并
*/
else if ((p->data.exp) == (q->data.exp))
{
P3->data.ratio = (p->data.ratio) + (q->data.ratio);
P3->data.exp = p->data.exp;
if (p ->next!= NULL)
p = p->next;
else
{
CopyList(P3,q->next);
break;
}
if (q->next != NULL)
q = q->next;
else
{
CopyList(P3,p->next);
break;
}
}
else{
P3->data.exp = q->data.exp;
P3->data.ratio = q->data.ratio;
if (q->next != NULL)
q= q->next;
else
{
CopyList(P3,p);
break;
}
}
}
/*在建立链表过程中,指针P3的值一直在改变,因此在完成合并链表后必须使P3指向头结点*/
P3=head;
}
void BubbleSort(ElemType st[],int n)
{
int i, j;
ElemType tmp;
for (i = 0; i < n; i++)
{
for(j=n-1;j>i;j--)
if(st[j].exp<st[j-1].exp)
{
tmp=st[j];
st[j]=st[j-1];
st[j - 1] = tmp;
}
}
}
void main()
{
int num1=5, num2=5;
LinkList *L1, *L2, *L3;
L1 = (LinkList *)malloc(sizeof(LinkList));
L2 = (LinkList *)malloc(sizeof(LinkList));
L3 = (LinkList *)malloc(sizeof(LinkList));
ElemType st1[] = { {5,5}, {4,4}, {7,7}, {6,6}, {2,2} };
ElemType st2[] = { {5,5}, {8,8}, {7,7}, {3,3}, {2,2} };
BubbleSort(st1, num1);
BubbleSort(st2, num2);
CreateListR(L1, st1, num1);
CreateListR(L2, st2, num2);
DispList(L1);
DispList(L2);
Add(L1, L2, L3);
DispList(L3);
DestroyList(L1);
DestroyList(L2);
DestroyList(L3);
}
② 鍦ㄧ嚎镐ц〃瀛桦偍涓锛屼负浠涔堥噰鐢ㄥ彧链夊熬鎸囬拡镄勫崟寰鐜阈捐〃瀛
镆愮嚎镐ц〃涓链甯哥敤镄勬搷浣沧槸鍦ㄦ渶钖庝竴涓鍏幂礌涔嫔悗鎻掑叆涓涓鍏幂礌鍜屽垹闄ょ涓涓鍏幂礌锛屽垯閲囩敤浠呮湁灏炬寚阍堢殑鍗曞惊鐜阈捐〃瀛桦偍鏂瑰纺链鑺傜渷杩愩傞塂銆
浠呮湁灏炬寚阍堢殑鍗曞惊鐜阈捐〃锛屽彲浠ラ潪甯告柟渚垮湴镓惧埌灏剧粨镣癸纴灏剧粨镣瑰悗闱㈢殑绗涓涓缁撶偣寰寰鏄澶寸粨镣癸纴澶寸粨镣圭殑涓嬩竴涓缁撶偣灏辨槸绗绾挎ц〃镄勭涓涓缁撶偣銆傚规渶钖庝竴涓鍏幂礌鍜岀涓涓鍏幂礌镎崭綔瀵瑰甫灏炬寚阍堢殑鍗曞惊鐜阈捐〃鏄闱炲父鏂逛究镄勚
镓╁𪾢璧勬枡锛
绾挎ц〃涓鏁版嵁鍏幂礌涔嬮棿镄勫叧绯绘槸涓瀵逛竴镄勫叧绯伙纴鍗抽櫎浜嗙涓涓鍜屾渶钖庝竴涓鏁版嵁鍏幂礌涔嫔栵纴鍏跺畠鏁版嵁鍏幂礌閮芥槸棣栧熬鐩告帴镄勶纸娉ㄦ剰锛岃繖鍙ヨ瘽鍙阃傜敤澶ч儴鍒嗙嚎镐ц〃锛岃屼笉鏄鍏ㄩ儴銆傛瘆濡傦纴寰鐜阈捐〃阃昏緫灞傛′笂涔熸槸涓绉岖嚎镐ц〃锛埚瓨鍌ㄥ眰娆′笂灞炰簬阈惧纺瀛桦偍锛屼絾鏄鎶婃渶钖庝竴涓鏁版嵁鍏幂礌镄勫熬鎸囬拡鎸囧悜浜嗛栦綅缁撶偣锛夈
鑻ョ嚎镐ц〃闇瑕侀戠箒镆ユ垒锛屽緢灏戣繘琛屾彃鍏ュ拰鍒犻櫎镎崭綔镞讹纴瀹滈噰鐢ㄩ‘搴忓瓨鍌ㄧ粨鏋勚傝嫢闇瑕侀戠箒鎻掑叆鍜屽垹闄ゆ椂锛屽疁閲囩敤鍗曢摼琛ㄧ粨鏋勚
褰撶嚎镐ц〃涓镄勫厓绱犱釜鏁板彉鍖栬缉澶ф垨钥呮牴链涓岖煡阆撴湁澶氩ぇ镞讹纴链濂界敤鍗曢摼琛ㄧ粨鏋勶纴杩欐牱鍙浠ヤ笉闇瑕佽冭槛瀛桦偍绌洪棿镄勫ぇ灏忛梾棰桡纴濡傛灉鐭ラ亾澶ц嚧闀垮害锛屽疁閲囩敤椤哄簭瀛桦偍缁撴瀯銆
③ 什么是单链表,储存上有哪些特点
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。
祝好运,望采纳