线性表的基本操作

1.定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。

2.一元多项式的运算
采用单链表存储一元多项式,实现如下功能
(1)从键盘输入一元多项式的各项系数和指数,创建一元多项式链表;
(2)输出该一元多项式;
(3)修改多项式(可修改任意一项的系数值或指数值);
(4)任意输入的两个多项式相加,求和多项式;
(5)任意输入的两个多项式相减,求差多项式。

顺序表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct {
    char no[8];   //8位学号
    char name[20]; //姓名
    int price;     //成绩
}Student;
typedef  struct {
  Student  *elem;     //指向数据元素的基地址
  int  length;       //线性表的当前长度                                                           
 }SqList;

SqList Create()
{
	int i;
	SqList list;
	printf("请输入要添加的学生个数:");
	scanf("%d",&list.length);
	list.elem = (Student*)malloc(sizeof(Student)* list.length);
	for(i=0;i<list.length;i++)
	{
		printf("请输入第%d位同学的学号 姓名 成绩:",i+1);
		scanf("%s%s%d",list.elem[i].no,list.elem[i].name,&list.elem[i].price);
	}
	return list;
}

void Print(SqList list)
{
	int i;
	printf("%-10s%-10s%-10s\n","学号","姓名","成绩");
	for(i=0;i<list.length;i++)
	{
		printf("%-10s%-10s%-10d\n",list.elem[i].no,list.elem[i].name,list.elem[i].price);
	}
}


void SerachName(SqList list)
{
	char name[20];
	int i;
	printf("请输入要查询的学生姓名:");
	scanf("%s",name);
	for(i=0;i<list.length;i++)
	{
		if(!strcmp(name,list.elem[i].name))
		{
				printf("%-10s%-10s\n","学号","成绩");
				printf("%-10s%-10d\n",list.elem[i].no,list.elem[i].price);
				break;
		}
	}
	if(i==list.length)
		printf("无该学生信息!\n");
}

int GetLength(SqList list)
{
	return list.length;
}

void GetByCIndex(SqList list)
{
	int index;
	printf("请输入要查询的位置:");
	scanf("%d",&index);
	if(index>list.length)
	{
		printf("无该学生信息!\n");
		return ;
	}
	printf("%-10s%-10s%-10s\n","学号","姓名","成绩");
	printf("%-10s%-10s%-10d\n",list.elem[index-1].no,list.elem[index-1].name,list.elem[index-1].price);
}

void Del(SqList* list)
{
	int index,i;
	printf("请输入要删除的位置:");
	scanf("%d",&index);
	if(index>list->length)
	{
		printf("无该学生信息!删除失败!\n");
		return ;
	}
	for(i=index;i<list->length-1;i++)
	{
		list->elem[i-1]=list->elem[i];
	}
	printf("删除成功!\n");
	list->length--;
}

void Insert(SqList* list)
{
	int i,index;
	printf("请输入要插入的位置:");
	scanf("%d",&index);
	if(index>list->length+1)
	{
		printf("该位置无法插入!\n");
		return ;
	}
	for(i=list->length;i>index;i++)
	{
		list->elem[i] = list->elem[i-1];
	}
	printf("请输入要插入同学的学号 姓名 成绩:");
	scanf("%s%s%d",list->elem[index-1].no,list->elem[index-1].name,&list->elem[index-1].price);
	printf("插入成功!\n");
	list->length++;
}

int main()
{
	SqList list = Create();
	Print(list);
	SerachName(list);
	GetByCIndex(list);
	Del(&list);
	Insert(&list);
	printf("学生人数为:%d\n",GetLength(list));
	Print(list);
	return 0;
}

单链表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct {
    char no[8];   //8位学号
    char name[20]; //姓名
    int price;     //成绩
}Student;

typedef struct LNode{
     Student   data;       //数据域
     struct LNode  *next;   //指针域
}LNode,*LinkList; 

LNode Create()
{
	int i,n;
	LNode head;
	head.next=NULL;
	LNode* p,*q;
	printf("请输入要添加的学生个数:");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		p=(LNode*)malloc(sizeof(LNode));
		p->next=NULL;
		printf("请输入第%d位同学的学号 姓名 成绩:",i+1);
		scanf("%s%s%d",p->data.no,p->data.name,&p->data.price);
		if(head.next==NULL)
		{
			head.next=p;
			q=p;
		}
		else
		{
			q->next=p;
			q=p;
		}
	}
	return head;
}

void Print(LNode head)
{
	LNode* p=head.next;
	printf("%-10s%-10s%-10s\n","学号","姓名","成绩");
	while(p)
	{
		printf("%-10s%-10s%-10d\n",p->data.no,p->data.name,p->data.price);
		p=p->next;
	}
}


void SerachName(LNode head)
{
	char name[20];
	LNode* p=head.next;
	printf("请输入要查询的学生姓名:");
	scanf("%s",name);
	while(p)
	{
		if(!strcmp(name,p->data.name))
		{
				printf("%-10s%-10s\n","学号","成绩");
				printf("%-10s%-10d\n",p->data.no,p->data.price);
				break;
		}
		p=p->next;
	}
	if(!p)
		printf("无该学生信息!\n");
}

int GetLength(LNode head)
{
	int count=0;
	LNode* p=head.next;
	while(p)
	{
		count++;
		p=p->next;
	}
	return count;
}

void GetByCIndex(LNode head)
{
	int index;
	LNode* p=head.next;
	printf("请输入要查询的位置:");
	scanf("%d",&index);
	while(p)
	{
		index--;
		if(index==0)
		{
			printf("%-10s%-10s%-10s\n","学号","姓名","成绩");
			printf("%-10s%-10s%-10d\n",p->data.no,p->data.name,p->data.price);
			break;
		}
		p=p->next;
	}
	if(index)
	{
		printf("无该学生信息!\n");
		return ;
	}
	
}

void Del(LNode* head)
{
	int index;
	LNode*p=head->next,*q;
	printf("请输入要删除的位置:");
	scanf("%d",&index);
	while(p && index)
	{
		if(--index==0)
		{	
			if(p==head->next)
			{
				head->next = p->next;
				free(p);
			}
			else
			{
				q->next=p->next;
				free(p);
			}
			printf("删除成功!");
			break;
		}
		q=p;
		p=p->next;
	}
	if(index)
		printf("无该学生信息!删除失败!\n");
}

void Insert(LNode* head)
{
	int index;
	LNode*p=head->next,*q,*temp;
	printf("请输入要插入的位置:");
	scanf("%d",&index);

	while(p && index)
	{
		if(--index==0)
		{	
			temp=(LNode*)malloc(sizeof(LNode));
			temp->next=NULL;
			printf("请输入要插入同学的学号 姓名 成绩:");
			scanf("%s%s%d",temp->data.no,temp->data.name,&temp->data.price);
			if(p==head->next)
			{
				temp->next=p;
				head->next=temp;
			}
			else
			{
				temp->next=p;
				q->next=temp;
			}
			printf("插入成功!\n");
			break;
		}
		q=p;
		p=p->next;
	}
	if(index)
		printf("插入失败!\n");
}

int main()
{
	LNode list = Create();
	Print(list);
	SerachName(list);
	GetByCIndex(list);
	Del(&list);
	Print(list);
	Insert(&list);
	Print(list);
	printf("学生人数为:%d\n",GetLength(list));
	return 0;
}

题目2:

#include<stdio.h>
#include<stdlib.h>

typedef struct PNode{
  float coef;  //系数
  int  expn;   //指数
  struct PNode *next;  //指针域
}PNode,*Polynomial;


PNode *Createlist()//创建一元多项式链表
{
  PNode *head,*middle,*s;//新定义三个链表head作为返回,middle作为中间变量,s为新插入项;
  float  coef;
  int exp;
  head = (PNode *)malloc(sizeof(PNode));
  if (!head)
  {
    exit(-1);
  }
  head->next = NULL;
  middle = head;
  printf("请输入每一项的系数和指数:");
  scanf("%f%d",&coef,&exp);
  while (!((coef==0)&&(exp==0)))//当系数和指数都为0时,多项式结束
  {
    s = (PNode *)malloc (sizeof(PNode));
    if (!s)
    {
      exit(-1);
    }
    s->coef = coef;
    s->expn = exp;
    s->next = middle->next;
    middle->next = s;
    middle = s;
   printf("请继续输入:");
    scanf("%f%d",&coef,&exp);
  }
  return head;
}

int Print(PNode *h)
{
  PNode *p = h->next;
  if(p)
  {
       printf("%g*x^%d",p->coef, p->expn);
       p=p->next;
  }
  while (p)
  {
    printf("+%g*x^%d",p->coef, p->expn);
    p = p->next;
  }
  printf("\n\n");
  return 1;
}

PNode * Listadd(PNode *listya, PNode *listyb)
{
    PNode * head=NULL,*temp,*q;
    PNode * p=listya;
	while(p)
	{
		temp=(PNode*)malloc(sizeof(PNode));
		temp->coef=p->coef;
		temp->expn=p->expn;
		temp->next=NULL;
		if(head==NULL)
		{
			head=temp;
			q=head;
		}
		else
		{
			q->next=temp;
			q=temp;
		}
		p=p->next;
	}

	for(p=listyb;p;p=p->next)
	{
		for(q=head;q;q=q->next)
		{
			if(p->expn == q->expn)
			{
				q->coef+=p->coef;
				break;
			}
		}
		if(q==NULL)
		{
			temp=(PNode*)malloc(sizeof(PNode));
			temp->coef=p->coef;
			temp->expn=p->expn;
			temp->next=head;
			head=temp;
		}
	}
	return head;
}

PNode * Listsub(PNode *listya, PNode *listyb)
{
    PNode * head=NULL,*temp,*q;
    PNode * p=listya;
	while(p)
	{
		temp=(PNode*)malloc(sizeof(PNode));
		temp->coef=p->coef;
		temp->expn=p->expn;
		temp->next=NULL;
		if(head==NULL)
		{
			head=temp;
			q=head;
		}
		else
		{
			q->next=temp;
			q=temp;
		}
		p=p->next;
	}

	for(p=listyb;p;p=p->next)
	{
		for(q=head;q;q=q->next)
		{
			if(p->expn == q->expn)
			{
				q->coef-=p->coef;
				break;
			}
		}
		if(q==NULL)
		{
			temp=(PNode*)malloc(sizeof(PNode));
			temp->coef=p->coef;
			temp->expn=p->expn;
			temp->next=head;
			head=temp;
		}
	}
	return head;
}

int main()
{
	printf("请输入第一个多项式:\n");
	PNode* p1 = Createlist();
	Print(p1);
	printf("请输入第二个多项式:\n");
	PNode* p2 = Createlist();
	Print(p2);
	printf("和多项式为:\n");
	PNode* p3=Listadd(p1,p2);
	Print(p3);
	printf("差多项式为:\n");
	PNode* p4=Listsub(p1,p2);
	Print(p4);
	return 0;
}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值