数据结构实验代码整理
- 线性表
1. 设顺序表A中的数据元素递增有序,试写一程序,将x插入到顺序表的适当位置上,使该表仍然有序。
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
/**
* 顺序表结构
*/
typedef struct{
int *elem; // 存储空间基址
int length ; // 列表长度
int listsize; // 储存容量
}SqList;
/**
* 初始化
*/
void InitList(SqList *L){
L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int)); // 创建一个空列表
L->length = 0; // 空表长度为0
L->listsize = LIST_INIT_SIZE; // 初始存储容量
}
/**
* 输入
*/
void InputData(SqList *L){
printf("请输入列表元素个数:");
int n;
scanf("%d",&n);
/*判断列表是否需要扩容*/
int *p;
p = L->elem;
if(n > L->listsize){
L->elem = (int*)realloc(L->elem, (L->listsize+LISTINCREMENT)*sizeof(int));
L->listsize += (n + LISTINCREMENT);
}
/*输入列表*/
printf("请输入元素:");
while(n!=0){
scanf("%d", p);
p ++;
n --;
L->length ++;
}
}
/**
* 输出顺序列表
*/
void OutputList(SqList *L){
int i;
int *p = L->elem;
for(i = 0; i<L->length; i ++, p ++) printf("%d ",*p);
}
/**
* 插入元素
*/
void InsertElem(SqList *L,int e){
/*溢出判断*/
if(L->length + 1 > L->listsize){
L->elem = (int*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));
L->listsize += LISTINCREMENT;
}
int *p = L->elem;
int *p_last = L->elem+L->length-1;
/* 查找元素插入的位置*/
while(e > *p&&p<p_last) p++;
int *q ;
for(q = (L->elem)+(L->length)-1; q >= p; q--) *(q+1) = *q;
*p = e;
L->length ++;
}
int main(){
SqList L; // 定义一个顺序表
InitList(&L); // 初始化
InputData(&L); // 输入数据
OutputList(&L); // 显示数据
printf("插入数据:");
int m;
scanf("%d", &m);
InsertElem(&L, m);
printf("\n插入后的顺序表:");
OutputList(&L);
return 0;
}
2. 用单链表ha存储多项式A(x )=a0+a1x1+a2x2+…+anxn(其中aI为非零系数),用单链表hb 存储多项式B(x)=b0+b1x1+b2x2+…+bmxm(其中bj为非零系数),要求计算C(x )= A(x )+B(x),结果存到单链表hc中。试写出程序。
#include<stdio.h>
#include<stdlib.h>
typedef struct list{
int c;//系数
int e;//指数
struct list *next;
}list,*Linklist;
//创建多项式
Linklist creatPolyn(){
Linklist head,p,q;
int m;
head = (Linklist)malloc(sizeof(list));
head->next= NULL;
q = head;
printf("请输入多项式的项数:");
scanf("%d",&m);
for(int i=0;i<m;i++){
p = (Linklist)malloc(sizeof(list));
printf("输入第%d项的系数:",i+1);
scanf("%d",&p->c);
printf("输入第%d项的指数:",i+1);
scanf("%d",&p->e);
p->next = q->next;
q->next = p;
q = q->next;
}
return head;
}
//多项式相加
Linklist AddPolyn(Linklist pa,Linklist pb){
Linklist a,b,pc,c;
a = pa;//保存pa的头结点
//printf("pa->c = %d pa->e = %d\n",pa->c,pa->e);
b = pb;//保存pb的头结点
//将pa,pb多项式相加的结果保存在c中
c = (Linklist)malloc(sizeof(list)); //给 C 申请一个空间
c->next = NULL; // 生成头结点
pc = c;//把头结点 给pc 方便之后操作!如果没有pc这个变量,直接操作c的话,return c 的结果只有最后一项,因为在过程中,c的地址已经发生了变化
while(a&&b){
int m,n,sum;
m=a->e; n=b->e; // m,n分别保存 a,b的 指数
if(m>n){
pc->next = b;
pc = pc->next;
b = b->next;
//printf("b多项式指数小 %d*X^%d\n",pc->c,pc->e);
}
else if(m == n){
sum = a->c + b->c;
if(sum!=0){
a->c = sum;
pc->next = a;
pc=pc->next;
//printf("多项式指数一样大 %d*X^%d\n",pc->c,pc->e);
}
//在这里有个 小bug 我不会修改了!bug是: 当两个多项式的最有一项和为0时,计算结果却是,项数多的那个多项式的最后一项
//a,b 已经处理完毕,同时后移一位。
a = a->next;
b = b->next;
}
else{
pc->next = a;
pc = pc->next;
a = a->next;
//printf("a多项式指数小 %d*X^%d\n",pc->c,pc->e);
}
}
// 判断那个多项式没有走到 NULL 然后将pc->next 直接指向剩余的多项式
if(a!=NULL){
pc->next = a;
}
if(b!=NULL){
pc->next = b;
}
return c;
}
void printList(Linklist L){
while(L !=