线性表练习

By ZJX
拖延症更新中
PS。这是2020 春我的数据结构作业 可以参考 可以跑 但不要完整抄作业 3Q


T17 顺序表 用一个辅助结点 ,实现向右循环k位的运算

//T17 
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
struct sqList{
	int num[MAXSIZE];
	int last;
};
typedef struct sqList *list;


list creat()
{
	int n,i=0;
	list L=(list)malloc(sizeof(struct sqList));
	L->last=-1;
	printf("please enter List,until -1\n");
	while(1)
	{
		scanf("%d",&n);
		if(n==-1) break;
		else
		{
			L->num[i++]=n;
			L->last++;
		}
	}
	return L;
}

list move(list L,int k)
{ 
	int i,j,temp=0;
	if(L->last==-1) printf("false list\n");
	else{
		for(i=0;i<k;i++)
		{
			for(j=L->last;j>=0;j--)
			{
				if(j==L->last) temp=L->num[j];
				else L->num[j+1]=L->num[j];
			 }
			 L->num[0]=temp;
		}
	}
	return L;
}

void output(list L)
{
	int i;
	for(i=0;i<=L->last;i++)
		printf("%d ",L->num[i]);
}

int main()
{
	int k;
	list L=creat();
	printf("please enter k\n");
	scanf("%d",&k);
	move(L,k);
	output(L);
}

T19有序顺序表 从小到大合并

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
struct sqList{
	int num[MAXSIZE];
	int last;
};
typedef struct sqList *list;


list creat()
{
	int n,i=0;
	list L=(list)malloc(sizeof(struct sqList));
	L->last=-1;
	printf("please enter List,until -1\n");
	while(1)
	{
		scanf("%d",&n);
		if(n==-1) break;
		else
		{
			L->num[i++]=n;
			L->last++;
		}
	}
	return L;
}

void output(list L)
{
	int i;
	for(i=0;i<=L->last;i++)
		printf("%d ",L->num[i]);
}


list merge(list L1,list L2)
{
	int length1=L1->last+1;
	int length2=L2->last+1;
	int i=0,j=0,k=0;
	list L=(list)malloc(sizeof(struct sqList));
	L->last=-1;


	while(length1>0||length2>0)
	{
		if(length1>0&&length2>0)
		{

			if(L1->num[i]<L2->num[j])
			{
				L->num[k++]=L1->num[i++];
				length1--;
				L->last++;
			}
			else if(L1->num[i]>L2->num[j])
			{
				L->num[k++]=L2->num[j++];
				length2--;
				L->last++;
			}
		}
		else if(length2==0)
		{
			L->num[k++]=L1->num[i++];
			L->last++;
			length1--;
		}
		else if(length1==0)
		{
			L->num[k++]=L2->num[j++];
			L->last++;
			length2--;
		}
	}
	return L;
}

int main()
{
	list L1=creat();
	list L2=creat();
	list L=merge(L1,L2);
	output(L);
}

T21 线性表逆置,占用原空间

对于顺序表,那很easy啦
两头对换一下即可 设计函数list exchange(list L) 最终还是返回表L
对于链表——
设计一个reverse函数吧! 我采用的是头插法(一个r防止链端),,当然还有设两个指针的防止链断的,懒得写了

ps.这题一定要画图才清晰

#include<stdio.h>
#include<stdlib.h>
typedef struct node *List;
struct node
{
	int data;
	List next;
}; 

List creat()
{
	int k;
	List s,r,head;
	List L=(List)malloc(sizeof(struct node));
	L->next=NULL;
	head=L;
	r=L;
	printf("please enter list until -1\n");
	while(1)
	{
		scanf("%d",&k);
		if(k==-1) break;
		else
		{
			s=(List)malloc(sizeof(struct node));
			s->data=k;
			r->next=s;
			r=s;
		}
	}
	r->next=NULL;
	return head;
}

void reverse(List L)
{
	List p,r;
	p=L->next;
	L->next=NULL;
	while(p)
	{
		r=p->next;
		p->next=L->next;
		L->next=p;
		p=r;
	}
}

void output(List L)
{
	List p=L->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}


int main()
{
	List L;
	L=creat();
	output(L);
	reverse(L);
	output(L);
	
}

T22 按整数值递增排列 将x插入表L中,使L仍然有序

我的思路:按位序扫描链表,扫到一个值比x小了,那么记录此时的指针指向,在这个位置后面插入就行了 insert(L,x,i+1) 或者不用之前已经写的insert模版,手动写一个插入,会更快

//T22 按整数值递增排列 将x插入表L中,使L仍然有序
#include<stdio.h>
#include<stdlib.h>
typedef struct node *List;
struct node
{
	int data;
	List next;
}; 

List creat()
{
	int k;
	List s,r,head;
	List L=(List)malloc(sizeof(struct node));
	L->next=NULL;
	head=L;
	r=L;
	printf("please enter list until -1\n");
	while(1)
	{
		scanf("%d",&k);
		if(k==-1) break;
		else
		{
			s=(List)malloc(sizeof(struct node));
			s->data=k;
			r->next=s;
			r=s;
		}
	}
	r->next=NULL;
	return head;
}

void insert(List L,int x)//查找x要插入的位置 
{
	List p=L->next;
	List pre=L;
	List s=(List)malloc(sizeof(List));
	s->data=x;
	while (p&&p->data<=x)
	{
		pre=p;
		p=p->next;
	}
	pre->next=s;
	s->next=p;
}



void output(List L)
{
	List p=L->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

 int main()
 {
 	List L;
 	int data;
 	L=creat();
 	output(L);
 	printf("data=");
 	scanf("%d",&data);
 	insert(L,data);
 	output(L);
 }

T31 三类字符构造循环链表

我的思路:造三个小链表,扫描原链表,判断数据域的类型,插入到对应的三个链表中
题目要求:利用原表中的结点空间作为这三个表的结点空间:是的,以上方法只改变了指针的指向

本来我不知道怎么构造一个有三种类型的链表
偷看了下ppt 要用Union

T27

之前两题reverse和insert的综合体 综合即可,2分钟,很简单

#include<stdio.h>
#include<stdlib.h>
typedef struct node *List;
struct node
{
	int data;
	List next;
};

List creat()
{
	int k;
	List s,r,head;
	List L=(List)malloc(sizeof(struct node));
	L->next=NULL;
	head=L;
	r=L;
	printf("please enter list until -1\n");
	while(1)
	{
		scanf("%d",&k);
		if(k==-1) break;
		else
		{
			s=(List)malloc(sizeof(struct node));
			s->data=k;
			r->next=s;
			r=s;
		}
	}
	r->next=NULL;
	return head;
}

void reverse(List L)
{
	List p,r;
	p=L->next;
	L->next=NULL;
	while(p)
	{
		r=p->next;
		p->next=L->next;
		L->next=p;
		p=r;
	}
}

void insert(List L,int x) 
{
	List p=L->next;
	List pre=L;
	List s=(List)malloc(sizeof(List));
	s->data=x;
	while (p&&p->data>=x)
	{
		pre=p;
		p=p->next;
	}
	s->next=pre->next;
	pre->next=s;

}
List ReAndSort(List L1,List L2)
{
	reverse(L1);
	List p=L2->next;
	while(p)
	{
		insert(L1,p->data);
		p=p->next;
	}
	return L1;
}

void output(List L)
{
	List p=L->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

int main()
{
	List L1,L2,p;
	L1=creat();
	L2=creat();
	p=ReAndSort(L1,L2);
	output(p);
}

试题名称 学生信息管理 时间限制: 1 秒 内存限制: 10000KB

问题描述
某班学生的信息存放在一个线性单链表中,但每学期都有学生因故退学。现要求根据退学学生的学号,将其信息从链表中删除。假设学生的数据只保存姓名、学号、性别,并采用结构体类型描述。

输入说明
输入n个学生数据(1<=n<=10)。每行一个学生信息,包括:姓名(不超过20个字符的字符串)、学号(整形)、性别(字符),以空格分隔。学生数据以#结束,并在下一行输入退学学生的学号。

输出说明 若链表中有退学学生,输出删除该学生后的学生数据;如果链表中没有该学生,则输出错误信息No。

输入样例 例1: LiDong 1001 M ZhaoJian 1002 M ChenKai 1003 M LiXia 1004 F
WangHong 1005 F QianLi 1006 F ZhouQiang 1007 M
# 1003

例2: LiDong 1001 M ZhaoJian 1002 M ChenKai 1003 M LiXia 1004 F WangHong
1005 F QianLi 1006 F ZhouQiang 1007 M
# 1008

输出样例 例1: LiDong 1001 M ZhaoJian 1002 M LiXia 1004 F WangHong 1005 F
QianLi 1006 F ZhouQiang 1007 M

例2: No

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node *List;
struct node{
	char name[25];
	int num;
	char sex;
	List next;
};

List creat()
{
	int number;
	char se;
	List L=(List)malloc(sizeof(struct node));
	L->next=NULL;
	List r,s,head;
	head=L;
	r=L;//尾指针
	char names[25];

	while(1)  
	{	
		scanf("%s",names);
		if(names[0]=='#') break;  //不是#的时候循环 
		else{
			s=(List)malloc(sizeof(struct node));
			scanf("%d %c ",&number,&se);
			strcpy(s->name,names);
			s->num=number;
			s->sex=se;
			s->next=NULL;
			r->next=s;
			r=s;
			}
	}
	return head;
}

int find(List L,int x)//查找值为x 
{
	List p=L->next;
	int t=1;
	while(p!=NULL&&p->num!=x)
	{
		t++;
		p=p->next;
	}
	if(p==NULL) t=-1;
	return t;
}
 
 void delete0(List L,int i)//第i位删除
{
 	List p=L;
 	List pre;
 	int cnt=0;
 	while(cnt!=i-1)
 	{
 		p=p->next;
 		cnt++;
	}
	pre=p;
	pre->next=p->next->next;
} 

void output(List L)
{
	List p=L->next;
	while(p)
	{
		printf("%s %d %c",p->name,p->num,p->sex);
		p=p->next;
		printf("\n");
	}
}


int main()
{
	List stu=creat();
	int data,k;	
	scanf("%d",&data);
	k=find(stu,data);
	if(k==-1) printf("No");
	else
	{
		delete0(stu,k);
		output(stu);
	}
}

OJ其他两题的主要函数都写过了,如果有人看到这里有不明白的可以私信
发布了46 篇原创文章 · 获赞 13 · 访问量 3681

猜你喜欢

转载自blog.csdn.net/qq_39679772/article/details/104618982