1.字符串B是否是A的一部分(单链表存储)
思路:朴素模式匹配
typedef struct Node
{
char data;
Node *next;
}*list;
bool cmp(char B[],list A)
{
list p=A->next; //工作指针
list now=p;//定位
int i=0;
while(i<strlen(B)&&p!=NULL)
{
if(B[i]==p->data)
{
i++;
p=p->next;
}
else
{
i=0;
now=now->next;
p=now;
}
}
if(i==strlen(B))return true; //完成匹配
return false; //匹配到链尾也没成功
}
2.教师信息有(工号,性别,姓名,入学年份),有文件input.txt,设计一个管理教师信息的程序。
typedef struct Teacher
{
int num;
int sex;
char name[20];
int year;
Teacher *next;
}*teacher;
void insert(teacher head)//插入
{
teacher p=(teacher)malloc(sizeof(struct Teacher));
scanf("%d %d %s %d",&p->num,&p->sex,p->name,&p->year);
teacher q=head->next;
while(q->next->num<p->num&&q->next!=NULL) //找到位置插到q后面
{
q=q->next;
}
p->next=q->next;
q->next=p;
}
void build(teacher head)//从文件中读数据并建立链表
{
FILE *fp=fopen("input.txt","r");
teacher q=head;
if(fp==NULL)
printf("FILE OPEN ERROR\n");
while(!feof(fp))
{
teacher p=(teacher)malloc(sizeof(struct Teacher));
fscanf(fp,"%d %d %s %d",&p->num,&p->sex,p->name,&p->year);
q->next=p;
q=p;
}
q->next=NULL;
}
void sort(teacher head)
{
teacher p,pre,tail;//冒泡排序
tail=NULL;
while(head->next!=tail)
{
pre=head;
p=head->next;
while(p->next!=tail)
{
if(p->num>p->next->num)//当前节点比后面的节点大,换位置
{
pre->next=p->next;
p->next=pre->next->next;
pre->next->next=p;
}
else
{
p=p->next;
}
pre=pre->next;
}
tail=p;
}
}
void del(teacher head)
{
int n;
scanf("%d",&n);//读入要删除的结点序号
teacher p=head;
while(p->next!=NULL)
{
if(p->next->num==n)
{
p->next=p->next->next;
return;
}
p=p->next;
}
return;
}
3.(2x+3y)n,求第k项系数:例(2x+3y)3=8x3+36x2y+54xy2+27y3,第2项系数为54。要求递归求第k项系数(0<=k<=n),不能使用全局变量。
思路:
根据多项式表达式,第k项系数等于Cnk2n-k3k。
int xs(int n,int k)
{
if(k==0&&n==k)return 1;//C00的情况
if(k==0)return 2*xs(n-1,k);//Cn0的情况,即第一个项
if(k==n)return 3*xs(n-1,k-1);//Cnn的情况,即最后一个项
else return 2*xs(n-1,k)+3*xs(n-1,k-1);//cnk=c(n-1,k)+c(n-1,k-1)
}
4.删除链表指定数据结点
typedef struct Node
{
int data;
struct Node *next;
}*list;
void del(list head,int x)
{
list p=head;
while(p!=NULL&&p->next!=NULL)//p未到表尾,则循环,可以删除所有值为x的结点
{
//p!NULL是因为删除了p的后继之后,p可能为尾结点,这时P后移就会遇到NULL
if(p->next->data==x)
{
list s=p->next;
p->next=p->next->next;
free(s);
}
p=p->next;
}
return;
}