本周对链表的使用有了更深的理解,具体在链表的创建,求链表的长度。
创建
之前对链表的创建停留在一种很低端的创建方法,经过这周学习了解到有头插和尾插之分,。头插是从头链表的头部插入,尾插是从链表的尾部插入。
具体代码如下:
头插:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
}LNode,*LinkList;
Linklist create(int i){
LNode *pnew,*head,*p=head;
head=(LinkList) malloc sizeof(LNode);
head->next=NULL;
int j;
for(j=0;j<i;j++){
pnew=(LinkList) malloc sizeof(LNode);
scanf("%d",&pnew->data);
pnew->next=p->next;
p->next=pnew;
}
return head;
}
尾插:
typedef struct node{
int data;
struct node* next;
}LNode,*LinkList;
LinkList create(int i){
int j=0;
LinkList Head=(LinkList)malloc(sizeof(LNode));
Head->next=NULL;
LNode *s,*p=Head;
while(j++<i){
s=(LinkList)malloc(sizeof(LNode));
scanf("(%d,%d)",&s->i,&s->j);
s->next=NULL;
p->next=s;
p=s;
}
return Head;
}
求链表长度
int length(LinkList head){
int i=0;
LNode* p=head;
while(p->next!=NULL){
i++;
p=p->next;
}
return i;
}
我用多项式实现了多项式的相乘
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int i;
int j;
struct node* next;
}LNode,*LinkList;
LinkList create(int i){
int j=0;
LinkList Head=(LinkList)malloc(sizeof(LNode));
Head->next=NULL;
LNode *s,*p=Head;
while(j++<i){
s=(LinkList)malloc(sizeof(LNode));
scanf("(%d,%d)",&s->i,&s->j);
s->next=NULL;
p->next=s;
p=s;
}
return Head;
}
//打印
void print(LinkList Head){
LNode *q=Head->next;
int index1=0;
while(q!=NULL){
if(q->i!=0){
index1=1;
break;
}
if(q->next!=NULL){
q=q->next;
}else{
break;
}
}
if(index1!=1){
printf("0");
}
int index=0;
while(q!=NULL){
//系数为0时
//第一个数字
//系数为0时
if(q->i==0){
printf("");
}
//系数为1时
if(q->i==1){
if(q->j==0&&index==0){
printf("1");
}
if(q->j==0&&index!=0){
printf("+1");
}
if(q->j==1&&index==0){
printf("X");
}
if(q->j==1&&index!=0){
printf("+X");
}
if(q->j!=1&&index==0){
printf("X^%d",q->j);
}
if(q->j!=1&&index!=0){
printf("+X^%d",q->j);
}
}
//系数为-1时
if(q->i==-1){
if(q->j==0){
printf("-1");
}
if(q->j==1){
printf("-X");
}
if(q->j!=1&&q->j!=0){
printf("-X^%d",q->j);
}
}
//系数非0非1非-1时
if(q->i!=0&&q->i!=1&&q->i!=-1){
if(q->j==0&&index==0){
printf("%d",q->i);
}
if(q->j==0&&index!=0){
printf("%+d",q->i);
}
if(q->j==1&&index==0){
printf("%dX",q->i);
}
if(q->j==1&&index!=0){
printf("%+dX",q->i);
}
if(q->j!=0&&q->j!=1&&index==0){
printf("%dX^%d",q->i,q->j);
}
if(q->j!=0&&q->j!=1&&index!=0){
printf("%+dX^%d",q->i,q->j);
}
}
q=q->next;
index=1;
}
}
//链表的长度
int length(LinkList head){
int i=0;
LNode* p=head;
while(p->next!=NULL){
i++;
p=p->next;
}
return i;
}
//乘法
LinkList mul(LinkList head1,LinkList head2){
LinkList head,head4;//头指针
head4=(LinkList)malloc(sizeof(LNode));
head=(LinkList)malloc(sizeof(LNode));
head->next=head->next=NULL;
LNode *p=head,*pnew,*m=head1->next,*n=head2->next,*q=head4,*temp;
int i,j;
//创建一个新链表用来存储相乘后的数据
temp=n;
for(i=0;i<(length(head1));i++){
n=temp;
for(j=0;j<(length(head2));j++){
pnew=(LinkList)malloc(sizeof(LNode));
pnew->i=(m->i)*(n->i);
pnew->j=(m->j)+(n->j);
pnew->next=NULL;
p->next=pnew;
p=pnew;
if(n->next!=NULL){
n=n->next;
}else{
break;
}
}
if(m->next!=NULL){
m=m->next;
}else{
break;
}
}
//创建一个链表用来表示最终结果
pnew=(LinkList)malloc(sizeof(LNode));
p=head->next;
pnew->i=p->i;
pnew->j=p->j;
pnew->next=NULL;
q->next=pnew;
q=pnew;
if(p->next!=NULL){
p=p->next;
}else{
return head4;
}
temp=p;
for(i=1;i<length(head);i++){
//对指数相同的数据进行合并
while(p!=NULL){
if(p->j==q->j){
q->i=(p->i)+(q->i);
p->i=0;
}
if(p->next!=NULL){
p=p->next;
}else{
break;
}
}
p=temp;
//将新指数加到链表中
if(p->i!=0){
pnew=(LinkList)malloc(sizeof(LNode));
pnew->i=p->i;
pnew->j=p->j;
pnew->next=NULL;
q->next=pnew;
q=pnew;
if(p->next!=NULL){
p=p->next;
}else{
return head4;
}
}else{
if(p->next!=NULL){
p=p->next;
}else{
return head4;
}
}
temp=p;
}
return head4;
}
//排序
LinkList sort(LinkList head){
LinkList head1=(LinkList)malloc(sizeof(LNode));
LNode *num,*q=head->next->next;
int i,j,temp;
for(i=0;i<length(head);i++){
num=head->next;
q=head->next->next;
for(j=0;j<length(head)-i;j++){
if((num->j)>(q->j)){
temp=num->j;
num->j=q->j;
q->j=temp;
temp=num->i;
num->i=q->i;
q->i=temp;
}
if(num->next){
num=num->next;
}else{
break;
}
if(q->next){
q=q->next;
}else{
break;
}
}
}
return head;
}
int main(){
int i,j;
scanf("%d",&i);
getchar();
LinkList head1=create(i);
scanf("%d",&j);
getchar();
LinkList head2=create(j);
LinkList head=mul(head1,head2);
LinkList head3=sort(head);
print(head3);
}