多项式加法
#include <stdio.h>
#include<malloc.h>
typedef struct LinkNode{
int coefficient;//底数
int exponent;//指数
struct LinkNode *next;//指针域
}*LinkList,*NodePtr;
/**
* 初始化头结点
*/
LinkList initLinkList(){
//初始化头结点,都为空
LinkList tempHeader = (LinkList)malloc(sizeof(struct LinkNode));
tempHeader->coefficient=0;
tempHeader->exponent=0;
tempHeader->next=NULL;
return tempHeader;
}
//打印链表
void printList(LinkList paraHeader){
NodePtr p=paraHeader->next;
while(p!=NULL)
{
printf("%d* x^%d+ ",p->coefficient,p->exponent);
p=p->next;
}
printf("\r\n");
}
void printNode(NodePtr paraPtr,char paraChar){
if(paraPtr==NULL)
{
printf("NULL\r\n");
}
else{
printf("The element of %c is (%d * x^%d)\r\n",paraChar,paraPtr->coefficient,paraPtr->exponent);
}
}
//在尾部添加元素
void appendElement(LinkList paraHeader,int paraCoefficient,int paraExponent)
{
NodePtr p,q;
//1.创建一个节点
q=(NodePtr)malloc(sizeof(struct LinkNode));
q->coefficient=paraCoefficient;
q->exponent=paraExponent;
q->next=NULL;
//2.寻找尾巴
p=paraHeader;
while(p->next!=NULL)
{
p=p->next;
}
//3.添加
p->next=q;
}
// paraList1 是第一个链表,paraList2是第二个链表
void add(NodePtr paraList1,NodePtr paraList2)
{
NodePtr p,q,r,s;
//1.寻找位置
p=paraList1->next;
printNode(p,'p');
q=paraList2->next;
printNode(q,'q');
r=paraList1;//先驱;
printNode(r,'r');
//free(paraList2);//第二个链表头结点消除
while((p!=NULL)&&(q!=NULL))
{
if(p->exponent < q->exponent)//继续找
{
//把第二个链接到第一个上
printf("case 1r\n");
r->next=p;
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}
else if((p->exponent > q->exponent))
{
//连接到第二个上
printf("case 2\r\n");
r->next=q;//
r=q;
printNode(r,'r');
q=q->next;
printNode(q,'q');
}
else{//指数等于,二者相加
printf("case 3\r\n");
//改变第一个链表
p->coefficient=p->coefficient+q->coefficient;
printf("The coefficient is: %d.\r\n",p->coefficient);
if(p->coefficient==0)
{
printf("case 3.1\r\n");
s=p;
p=p->next;
printNode(p,'p');
//free(s); //如果释放S则会进入死循环
}
else{
printf("case 3.2\r\n");
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}
s=q;
q=q->next;
free(s);
}
printf("p= %p,q=%p\r\n",p,q);
}
printf("End of while.\r\n");
if(p==NULL)
{
r->next=q;
}
else{
r->next=p;
}
printf("Addition ends.\r\n");
}
void additionTest1()
{
//1.初始化第一个链表
LinkList tempList1=initLinkList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printList(tempList1);
// 给第二个链表赋值
LinkList tempList2=initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);
//添加到第一个链表
add(tempList1,tempList2);
printf("The result is: ");
printList(tempList1);
printf("\r\n");
}
void additionTest2(){
//1.初始化
LinkList tempList1=initLinkList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printList(tempList1);
// 给第二个链表赋值
LinkList tempList2=initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);
//添加到第一个链表
add(tempList1,tempList2);
printf("The result is: ");
printList(tempList1);
printf("\r\n");
}
int main()
{
additionTest1();
additionTest2();
printf("Finish:\r\n");
return 0;
}
栈
#include<stdio.h>
#include<malloc.h>
#define STACK_MAX_SIZE 10
typedef struct CharStack{
int top;
int data[STACK_MAX_SIZE];//最大长度
}*CharStackPtr;
void outputStack(CharStackPtr paraStack){
for(int i=0;i<=paraStack->top;i++)
{
printf("%c ",paraStack->data[i]);
}
printf("\r\n");
}
//初始化
CharStackPtr charStackInit()
{
CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
resultPtr->top=-1;
return resultPtr;
}
void push(CharStackPtr paraStackPtr,int paraValue){
//1.空间检查
if(paraStackPtr->top>=STACK_MAX_SIZE -1)
{
printf("Cannot push element: stack full.\r\n");
return;
}
//2.更新顶部数据
paraStackPtr->top++;
//3.放元素
paraStackPtr->data[paraStackPtr->top]=paraValue;
}
//POP ELEMENT
char pop(CharStackPtr paraStackPtr){
//1.空间检查
if(paraStackPtr->top < 0)
{
printf("Cannot pop element:stack empty.\r\n");
return '\0';
}
//2.G更新顶部元素
paraStackPtr->top--;
//push element
return paraStackPtr->data[paraStackPtr->top+ 1];
}
//test
void pushPopTest(){
printf("----pushPopTest begins,---\r\n");
//初始化
CharStackPtr tempStack=charStackInit();
printf("After initialization,the stack is: ");
outputStack(tempStack);
//pop
for(char ch='a';ch<'m';ch++)
{
printf("pushing %c.\r\n",ch);
push(tempStack,ch);
outputStack(tempStack);
}
//pop
for(int i=0;i<3;i++)
{
char ch=pop(tempStack);
printf("pop %c.\r\n",ch);
outputStack(tempStack);
}
printf("----pushPopTest ends.----\r\n");
}
void main()
{
pushPopTest();
}