数据结构05

0501

创建并打印带有头结点的整数链表。
输入要求:
多组输入。
每组数据输入一个整数n(n>=0),代表元素个数,接下来输入n个整数
输出要求:
打印链表中的数据元素,每个整数后一个空格,打印结束后换行。
空表输出一个空行。
数据示例1:
输入:
6 
1 3 5 6 2 4
3
1 2 3
输出:
1 3 5 6 2 4 
1 2 3 
#include<stdio.h>
#include<stdlib.h>

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


void createList(LinkList &L, int n); // 创建n个结点的链表 

void printList(LinkList L); // 打印链表 

int main(){
	int n;
	while(~scanf("%d", &n)){
		LinkList L;
		createList(L, n);
		printList(L);
	}
	return 0;
}
/
void createList(LinkList &L, int n) // 创建n个结点的链表 
{
	L=new LNode;
	L->next=NULL;
	LNode *r=L;//始终指向最后一个结点 
	for(int i=0;i<n;i++)
	{
		LinkList p=new LNode;//创建一个新的结点 
		scanf("%d",&p->data);
		p->next=NULL;//给next域赋值 
		r->next=p;//将p链接到r的后面 
		r=r->next;
	}
}
void printList(LinkList L) // 打印链表 
{
	LNode *p=L->next;
	while(p!=NULL){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

0502

根据序号和值在带有头结点整数链表中进行查找
输入要求:
首先输入一个整数n(n>=0),代表元素个数,接下来输入n个整数
然后,循环输入由一个整数表示的操作命令,其中
0 代表打印链表
1 代表根据序号查找,接下来输入一个代表序号的整数
2 代表根据值查找,接下来输入要查找的值
输出要求:
根据输入的命令进行输出
0:打印链表中的数据元素,每个整数后一个空格,打印结束后换行。
1或2:查找成功输出元素的值,失败输出”Not Found“
数据示例1:
输入:
5
2 4 6 8 10
0
1 1
1 0
2 3
2 6
输出:
2 4 6 8 10 
2
Not Found
Not Found
6
#include<stdio.h>
#include<stdlib.h>

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


void createList(LinkList &L, int n); // 创建n个结点的链表 

void printList(LinkList L); // 打印链表 

// 根据序号查找 
// 返回序号为i(序号从1开始)的结点的地址,找不到返回NULL 
LNode* findI(LinkList L, int i); 

// 根据值查找
// 返回值为e的第一个节结点的地址,找不到返回NULL 
LNode* findV(LinkList L, int e);

int main(){
 LinkList L;
 int cmd, e, n, i;
 LNode *p;
 scanf("%d", &n);
 createList(L, n); 
 while (scanf("%d", &cmd) != EOF )  { // 选择操作 
  switch (cmd) {
  case 0:
   printList(L);
   break;
  case 1: // 根据序号查找 
   scanf("%d", &i);
   p = findI(L, i);
   if ( p!=NULL) printf("%d\n", p->data);
   else printf("Not Found\n");
   break; 
    
  case 2: // 根据值查找 
   scanf("%d", &e);
   p = findV(L, e);
   if ( p!=NULL) printf("%d\n", p->data);
   else printf("Not Found\n");
   break; 
   
  default:
   printf("Unknow Command.\n");
   break;
  }
 }
 return 0;
}
void createList(LinkList &L, int n) // 创建n个结点的链表 
{
	L=new LNode;
	L->next=NULL;
	LNode *r=L;
	for(int i=0;i<n;i++)
	{
		LNode *p=new LNode;
		scanf("%d",&p->data);
		p->next=NULL;
		r->next=p;
		r=r->next;
	}
}

void printList(LinkList L) // 打印链表 
{
	LNode *p=L->next;
	while(p!=NULL)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}
// 根据序号查找 
// 返回序号为i(序号从1开始)的结点的地址,找不到返回NULL 
LNode* findI(LinkList L, int i){
	LNode *p=new LNode;
	p=L->next;
	int j=1;
	while(p)
	{
		if(i==j){
			return p;
		}
		p=p->next;
		j++;
	}
	return NULL;
}
// 根据值查找
// 返回值为e的第一个节结点的地址,找不到返回NULL 
LNode* findV(LinkList L, int e){
	LNode *p=L->next;
	while(p){
		if(p->data==e){
			return p;
		}
		p=p->next;
	}
	return NULL;
}

0503

*根据序号和值在带有头结点整数链表中查找前驱结点
提示:
指针p所指结点的后继结点为p->next
指针p所指结点的后继结点的数据域为p->next->data
位置1的前驱结点为头结点
长度为n的链表,位置n+1的前驱结点为第n个结点(尾结点)
输入要求:
首先输入一个整数n(n>=0),代表元素个数,接下来输入n个整数
然后,循环输入由一个整数表示的操作命令,其中
0 代表打印链表
3 代表根据序号查找前驱,接下来输入一个代表序号的整数
4 代表根据值查找前驱,接下来输入要查找的值
输出要求:
根据输入的命令进行输出
0:打印链表中的数据元素,每个整数后一个空格,打印结束后换行。
3或4:查找成功输出前驱元素的值(头结点的值用”Unknown“表示),失败输出”Not Found“
数据示例1:
输入:
5
2 4 6 8 0
3 1
3 5
3 0
3 6
3 7
4 2
4 1
4 0
0
输出:
Unknown
8
Not Found
0
Not Found
Unknown
Not Found
8
2 4 6 8 0 
#include<stdio.h>
#include<stdlib.h>

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

void createList(LinkList &L, int n); // 创建n个结点的链表 

void printList(LinkList L); // 打印链表 

// 根据序号查找前驱 
// 返回序号为i(序号从1开始)的结点的前驱结点的地址,找不到返回NULL 
LNode* findIP(LinkList L, int i); 

// 根据值查找前驱 
// 返回值为e的第一个结点的前驱结点的地址,找不到返回NULL 
LNode* findVP(LinkList L, int e); 

int main(){
	LinkList L;
	int cmd, e, n, i;
	LNode *p;
	scanf("%d", &n);
	createList(L, n); 
	while (scanf("%d", &cmd) != EOF )  { // 选择操作 
		switch (cmd) {
		case 0:
			printList(L);
			break;
			
		case 3: // 根据序号查找前驱 
			scanf("%d", &i);
			p = findIP(L, i);
			if(p==L) printf("Unknown\n");
			else if ( p!=NULL) printf("%d\n", p->data);
			else printf("Not Found\n");
			break; 
			
		case 4: // 根据值查找前驱 
			scanf("%d", &e);
			p = findVP(L, e);
			if(p==L) printf("Unknown\n");
			else if ( p!=NULL) printf("%d\n", p->data);
			else printf("Not Found\n");
			break; 
						
		default:
			printf("Unknow Command.\n");
			break;
		}
	}
	return 0;
} 
//
void createList(LinkList &L, int n)// 创建n个结点的链表 
{
	L=new LNode;
	L->next=NULL;
	LNode *r=L;
	for(int i=0;i<n;i++){
		LNode *p=new LNode;
		scanf("%d",&p->data);
		p->next=NULL;
		r->next=p;
		r=r->next;
	}
}
void printList(LinkList L) // 打印链表 
{
	LNode *p=L->next;
	while(p!=NULL){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

// 根据序号查找前驱 
// 返回序号为i(序号从1开始)的结点的前驱结点的地址,找不到返回NULL 
LNode* findIP(LinkList L, int i){
	LNode *p=L;
	int j=1;
	while(p){
		if(j==i){
			return p;
		}
		p=p->next;
		j++;
	}
	return NULL;
}

// 根据值查找前驱 
// 返回值为e的第一个结点的前驱结点的地址,找不到返回NULL 
LNode* findVP(LinkList L, int e){
	LNode *p=L;
	while(p->next){
		if(p->next->data==e){
			return p;
		}
		p=p->next;
	}
	return NULL;	
}

0504

实现链表的插入和删除操作
注意:可以调用找前驱操作,以简化代码
输入要求:
首先输入一个整数n(n>=0),代表元素个数,接下来输入n个整数
然后,循环输入由一个整数表示的操作命令,其中
0 代表打印链表
5 代表插入,接下来输入插入位置和要插入的值
6 代表删除,接下来输入要删除元素的位置
输出要求:
根据输入的命令进行输出
0:打印链表中的数据元素,每个整数后一个空格,打印结束后换行。
5或6:操作成功输出”OK",失败输出”ERROR“
数据示例1:
输入:
5
2 4 6 8 0
5 0 999
5 7 999
5 6 999
5 7 999
5 1 999
0
6 0
6 8
6 8
6 1
0
输出:
ERROR
ERROR
OK
OK
OK
999 2 4 6 8 0 999 999 
ERROR
OK
ERROR
OK
2 4 6 8 0 999
#include<stdio.h>
#include<stdlib.h>

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


void createList(LinkList &L, int n); // 创建n个结点的链表 

void printList(LinkList L); // 打印链表 

// 在位置i(从1开始)插入元素e 
// 成功返回1,失败返回0 
int insert(LinkList &L, int i, int e); 

// 删除位置i的元素 
// 成功返回1,失败返回0 
int del(LinkList &L, int i); 

int main(){
	LinkList L;
	int cmd, e, n, i, re;
	LNode *p;
	scanf("%d", &n);
	createList(L, n); 
	while (scanf("%d", &cmd) != EOF )  { // 选择操作 
		switch (cmd) {
		case 0:
			printList(L);
			break;
			
		case 5: // 在位置i插入元素e
			scanf("%d %d", &i, &e);
			re = insert(L, i, e);
			if (re) printf("OK\n");
			else printf("ERROR\n");
			break; 
			
		case 6: // 删除位置i的元素 
			scanf("%d", &i);
			re = del(L, i);
			if (re) printf("OK\n");
			else printf("ERROR\n");
			break;  
						
		default:
			printf("Unknow Command.\n");
			break;
		}
	}
	return 0;
} 
/ 
void createList(LinkList &L, int n) // 创建n个结点的链表 
{
	L=new LNode;
	L->next=NULL;
	LNode *r=L;
	for(int i=0;i<n;i++){
		LNode *p=new LNode;
		scanf("%d",&p->data);
		p->next=NULL;
		r->next=p;
		r=r->next; 
	} 
}
void printList(LinkList L)// 打印链表 
{
	LNode *p=L->next;
	while(p!=NULL){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}
// 在位置i(从1开始)插入元素e 
// 成功返回1,失败返回0 
int insert(LinkList &L, int i, int e){
	LNode *p=L;
	int j=0;
	while(p&&(j<i-1)){
		p=p->next;
		j++;
	}
	
	if(!p||j>i-1){
		return 0;
	}
	LNode *s=new LNode;
	s->data=e;
	s->next=p->next;
	p->next=s;
	return 1;
}

// 删除位置i的元素 
// 成功返回1,失败返回0 
int del(LinkList &L, int i){
	LNode *p=L;
	int j=0;
	while((p->next)&&(j<i-1)){
		p=p->next;
		j++;
	}
	if((!p->next)||(j>i-1))return 0;
			LNode *r=p->next;
			p->next=r->next;
			delete r;
			return 1;
}

0505

复制非空链表中第一个最大元素=
输入要求:
多组输入。
每组首先输入一个整数n(n>0),表示表长,然后输入n个整数
输出要求:
输出复制操作后链表中元素,每个元素后面有一个空格,输出结束后换行。
数据示例1:
输入:
10 
1 2 3 4 5 1 2 3 4 5
3
1 2 3
输出:
1 2 3 4 5 5 1 2 3 4 5 
1 2 3 3
思路提示:
可以找到第一个最大元素后,在其后面插入一个相同元素。
#include<stdio.h>
#include<stdlib.h>

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

// 根据用户输入,创建n个结点的链表 
void createList(LinkList &L, int n); 

// 打印链表,每个元素后一个空格,打印结束换行 
void printList(LinkList L); 

// 复制非空链表中第一个最大元素
void duplicateMax(LinkList &L);


int main(){
	int n;
	while(~scanf("%d", &n)){
		LinkList L;
		createList(L, n);
		duplicateMax(L); 
		printList(L);
	}
	return 0;
}
//
// 根据用户输入,创建n个结点的链表 
void createList(LinkList &L, int n){
	L=new LNode;
	L->next=NULL;
	LNode *r=L;
	for(int i=0;i<n;i++)
	{
		LNode *p=new LNode;
		scanf("%d",&p->data);
		p->next=NULL;
		r->next=p;
		r=r->next;
	}
}

// 打印链表,每个元素后一个空格,打印结束换行 
void printList(LinkList L){
	LNode *p=L->next;
	while(p){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

// 复制非空链表中第一个最大元素
void duplicateMax(LinkList &L){
	LNode *p=L->next;
	LNode *max=new LNode;
//	LNode *r=new LNode;
	int n=0;
	max->data=p->data;
	while(p!=NULL){
		if((p->data)>max->data){
			max->data=p->data;
			n++;
		}
		p=p->next;
	}
	p=L;
	while(n--){
		p=p->next;
	}
	max->next=p->next;
	p->next=max;
}

0506

删除非空链表中第一个最小元素
输入要求:
多组输入。
每组首先输入一个整数n(n>0),表示表长,然后输入n个整数
输出要求:
输出删除操作后表中元素,每个元素后面有一个空格,输出结束后换行。
数据示例1:
输入:
6
1 2 3 1 2 3
5
5 4 3 2 1
输出:
2 3 1 2 3
5 4 3 2 
思路提示:
需要首先找到第一个最小元素的前驱
#include<stdio.h>
#include<stdlib.h>

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

void printList(LinkList L){
	LNode *p = L->next;
	while(p){
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

// 根据用户输入,创建n个结点的链表 
void createList(LinkList &L, int n); 

// 删除非空链表中第一个最小元素
void deleteMin(LinkList &L);


int main(){
	int n;
	while(~scanf("%d", &n)){
		LinkList L;
		createList(L, n);
		deleteMin(L); 
		printList(L);
	}
	return 0;
}
/
// 根据用户输入,创建n个结点的链表 
void createList(LinkList &L, int n){
	L=new LNode;
	L->next=NULL;
	LNode *r=L;
	for(int i=0;i<n;i++){
		LNode *p=new LNode;
		scanf("%d",&p->data);
		p->next=NULL;//给next域赋值 
		r->next=p;//将p链接到r的后面 
		r=r->next;
	}
} 

// 删除非空链表中第一个最小元素
void deleteMin(LinkList &L){
	LNode *p=L->next;
	LNode *min=new LNode;
	min->data=p->data;
	int n=0;
	while(p){
		if((p->data)<min->data){
			min->data=p->data;
			n++;
		}
		p=p->next;
	}
	p=L;
	while(n--){
		p=p->next;
	}
	p->next=p->next->next;
	delete min;
}

猜你喜欢

转载自blog.csdn.net/unhere123/article/details/115984173