明天要交了,准备崩溃了,知道思路但是不会写。用数据结构写的。可是我的数据结构知识完全不会。
题目:试设计算法,将单链表中前 m 个结点和后 n 个结点进行互换,即将线性表 (a1, a2, …, am, b1, b2, …, bn ) 改变成 (b1, b2, …, bn, a1, a2, …, am ) 。
我的想法是:先建立一个存放(a1, a2, …, am, b1, b2, …, bn)的线性表,然后再将将 (b1, b2, …, bn )从链表的当前位置上删除之后再插入 a1 到之前,并将 am设为表尾。
#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LinkList;
void CreateList(LinkList* &L,int n)
{
int i;
L=(struct LNode*)malloc(sizeof(struct LNode));
L->next = NULL;
LinkList *p;
for(i=n;i>0;--i)
{
P=(struct LNode*)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
}
int main()
{
struct LNode;
return 0;
}
数据结构
[解决办法]
我的思路:把b1插到表头,a1插到表尾。把b2插到b1后,a2插到a1后。依次进行就可以
[解决办法]
两部分的组内顺序都不变,那么找到 am 和 bn,bn->next = a1; am->next = null; 不就可以了吗
[解决办法]
//假设带表头结点的单向链表头指针为head,试编写一个算法将值为5的结点插入到连接表的第k个结点前,删除第k个节点,并对该链表进行排序。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
struct NODE {
int data;
struct NODE *next;
} H,*head,*p,*q,*s1,*s2,*s3,*s4,*s;
int i,j,k,n,t,m;
int main() {
srand(time(NULL));
//填写头节点数据
H.data=-1;
H.next=NULL;
head=&H;
//创建10个节点的单链表
p=head;
for (i=0;i<10;i++) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) return 1;
q->data=rand()%100;//填写0..99的随机值
q->next=NULL;
p->next=q;
p=q;
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//将值为5的结点插入到单链表的第k个结点前
k=3;
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==n) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) return 1;
q->data=5;
q->next=p->next;
p->next=q;
break;
}
p=p->next;
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//删除第k个节点
k=5;
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==n) {
q=p->next;
if (q) {
p->next=q->next;
free(q);
}
break;
}
p=p->next;
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//从小到大排序
for (p=head;p!=NULL && p->next!=NULL;p=p->next) {
for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {
if (p->next->data > q->next->data) {
//交换data
// printf("swap %02d %02d\n",p->next->data,q->next->data);
// t=p->next->data;p->next->data=q->next->data;q->next->data=t;
//或者
//交换next
// printf("swap %02d %02d\n",p->next->data,q->next->data);
s1=p->next;
s2=p->next->next;
s3=q->next;
s4=q->next->next;
if (s2!=s3) {
p->next=s3;
s3->next=s2;
q->next=s1;
s1->next=s4;
} else {
p->next=s3;
s3->next=s1;
q=s3;
s1->next=s4;
}
//输出整个单链表
// s=head->next;
// while (1) {
// if (NULL==s) {
// printf("\n");
// break;
// }
// printf("%02d->",s->data);
// s=s->next;
// }
// getchar();
}
}
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10
m=4;
n=6;
k=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
k++;
if (m+1==k) {
q=p;
}
s=p;
p=p->next;
}
s1=head->next;
head->next=q->next;
s->next=s1;
q->next=NULL;
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//释放所有节点
p=head->next;
while (1) {
if (NULL==p) {
break;
}
q=p->next;
free(p);
p=q;
}
return 0;
}
//18->94->58->17->27->20->43->57->75->78->
//18->94->05->58->17->27->20->43->57->75->78->
//18->94->05->58->27->20->43->57->75->78->
//05->18->20->27->43->57->58->75->78->94->
//43->57->58->75->78->94->05->18->20->27->
//
两部分的组内顺序都不变,那么找到 am 和 bn,bn->next = a1; am->next = null; 不就可以了吗
这个想法我懂,要用线性表的知识怎么实现呢??
#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*LinkList;
void CreateList(LinkList &L,int n)
{
int i;
struct LNode *tail,*p;
L=(struct LNode*)malloc(sizeof(struct LNode));
L->next = NULL;
tail=L;
for(i=0; i<n; i++)
{
p=(struct LNode*)malloc(sizeof(struct LNode));
printf("please input %dth number\n",i);
fflush(stdin);
scanf("%d",&p->data);
p->next=NULL;
tail->next=p;
tail=p;
}
}
int main()
{
struct LNode *head;
CreateList(head,10);
LNode *q=head->next;
while(q != NULL)
{
printf("%d\n",q->data);
q=q->next;
}
return 0;
}
两部分的组内顺序都不变,那么找到 am 和 bn,bn->next = a1; am->next = null; 不就可以了吗
看看我这个代码,输出部分怎么写呢??
#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
……
int main()
{
int n,m;
struct LNode *head,*r;
scanf("%d%d",&n,&m);
CreateList(head,n);
exchange(r,m);
//这部分怎么写输出??
return 0;
}
//将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10
m=4;
n=6;
k=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
k++;
if (m+1==k) {
q=p;
}
s=p;
p=p->next;
}
s1=head->next;
head->next=q->next;
s->next=s1;
q->next=NULL;
//将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10
m=4;
n=6;
k=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
k++;
if (m+1==k) {
q=p;//q指向旧链表第m个结点
}
s=p;//让s总是指向p的前一个结点
p=p->next;
}
//此时s指向旧链表最后一个结点
// head->1->2->3->4->5->6->7->8->9->10->NULL
// q^ s^
s1=head->next;//保存旧链表第1个结点的地址到s1中
// head->1->2->3->4->5->6->7->8->9->10->NULL
// s1^ q^ s^
head->next=q->next;//新链表第1个结点指向旧链表第m+1个结点
// /-------------v
// head 1->2->3->4->5->6->7->8->9->10->NULL
// s1^ q^ s^
s->next=s1;//旧链表最后一个结点的next指向旧链表第1个结点
// /-------------v
// head 1->2->3->4->5->6->7->8->9->10\
// s1^ q^ s^
[解决办法]
//
[解决办法]
____________________________/
q->next=NULL;//旧链表第m个结点的next指向NULL
// /-------------v
// head 1->2->3->4 5->6->7->8->9->10\
// s1^ q^\->NULL s^
[解决办法]
//
[解决办法]
____________________________/
typedef struct LNode
{
int data;
struct LNode *next;
}LinkList;
LinkList* list_cut(LinkList* lst,int pos,LinkList** suffix)
{
LNode* iter = NULL;
int count = 0;
for (iter = lst; NULL != iter; iter = iter->next) {
if (pos == ++count) {
break;
}
}
// 如果传入的位置参数超过链表长度了
if (NULL == iter) {
return NULL;
}
*suffix = iter->next;
iter->next = NULL;
return lst;
}
ListList* list_concat(ListList* lst1,ListList* lst2)
{
ListList* iter = NULL;
if (NULL == lst1)
return lst2;
// 找到最后一个元素
for (iter = lst1; NULL != iter->next; iter = iter->next) {
;
}
iter->next = lst2;
return lst1;
}
int main(int argc,char** argv)
{
ListList* lst1 = NULL;
ListList* lst2 = NULL;
...
// 假设已经创建好链表在lst1中了;
lst1 = list_cut(lst1,m,&lst2);
// 现在已经斩成两段了,重新连上即可
lst1 = list_concat(lst2,lst1);
// 大功告成!
return 0;
}
#include<iostream>
using namespace std;
typedef struct Node
{
int data;
struct Node* pNext;
}NODE,*PNODE;//NODE等价于struct Node,*PNODE等价于struct Node*
PNODE create_list(void );//创建链表,并给每个节点赋值
void traverse_list(PNODE);//遍历链表
bool Is_empty(PNODE);//判断链表是否为空
bool insert_list(PNODE,int,int); //插入一个节点
bool delete_list(PNODE,int,int*);//删除一个节点
bool displace(PNODE ,int) ;
int main(void)
{
PNODE pHead=nullptr;
bool t;
int i=0,val=0,b=0;
int* val1=&val;
pHead=create_list();
traverse_list(pHead);
cout<<"要插入的位置和插入的数值:";
cin>>i>>val;
insert_list(pHead,i,val);
traverse_list(pHead);
cout<<"指定要删除的位置:";
cin>>b;
t=delete_list(pHead,b,val1);
traverse_list(pHead);
if(t)
cout<<"删除的节点的值为:"<<*val1<<endl;
displace(pHead,3) ;
traverse_list(pHead);
system("pause");
return 0;
}
PNODE create_list(void)//创建一个链表,并给链表的节点赋值!
{
PNODE pHead=new NODE;
PNODE p=pHead;
p->pNext=nullptr;
int len;
int val;
cout<<"输入你想要链表的长度 len=";
cin>>len;
for(int i=0;i<len;i++)
{
cout<<endl<<"输入第"<<i+1<<"个节点的值:";
cin>>val;
PNODE New=new NODE;
New->data=val;//给节点赋值
New->pNext=nullptr;
p->pNext=New;//把节点的地址赋值给p所指向节点的指针域
p=New;//把节点的地址赋值给指针P
}
return pHead;
}
void traverse_list(PNODE pHead)//这是一个链表的遍历函数
{
if((Is_empty(pHead)))
{
cout<<"这是一个空链表!"<<endl;
return ;
}
PNODE p=pHead;
cout<<"链表的内容为:";
while(p->pNext != nullptr)
{
p=p->pNext;//把下一个节点的地址赋值给指针P
cout<<p->data<<" ";//输出节点的值
}
cout<<endl;
return ;
}
bool Is_empty(PNODE pHead)//判断一个链表是否为空
{
if(nullptr==pHead->pNext)
return true;
return false;
}
bool insert_list(PNODE pHead,int position,int val)//插入函数,附带判断插入是否成功!
{
int i=1;
PNODE p=pHead->pNext;
while(i<position-1&&p!=nullptr)//查询要插入的位置
{
p=p->pNext;
i++;
}
if(i>position-1
[解决办法]
nullptr==p)//如果查询失败,返回false....nullptr==p直接查询现在的指针是否为空!!为空后,后面的肯定不执行!
{
cout<<"插入失败!!"<<endl;
return false;
}
else
{
PNODE New=new NODE;
New->data =val;
if(nullptr==New)
{
cout<<"插入节点失败!"<<endl;
return false;
}
if(Is_empty(p))//下面都是插入细节
{
p->pNext=New;
New->pNext=nullptr;
return true;
}
else
{
New->pNext=p->pNext;
p->pNext=New;
return true;
}
}
}
bool delete_list(PNODE pHead,int position,int *val)
{
int i=1;
PNODE r=nullptr;
PNODE p=pHead->pNext;
while(i<position-1&&p!=nullptr)//查询要插入的位置
{
p=p->pNext;
i++;
}
if(i>position-1
[解决办法]
nullptr==p)//如果查询失败,返回false
{
cout<<"插入失败!!"<<endl;
return false;
}
else
{
if(Is_empty(p))//下面都是删除细节
{
*val=p->pNext->data;
r=p->pNext;
p->pNext=nullptr;
delete r;
return true;
}
else
{
*val=p->pNext->data;
r=p->pNext;
p->pNext=p->pNext->pNext;
delete r;
return true;
}
}
}
bool displace(PNODE pHead,int position)//置换
{
int i=1;
PNODE p=pHead->pNext;
PNODE q=pHead->pNext;
while(q->pNext != nullptr)//把尾节点找出来
{
q=q->pNext;
}
while(i<position-1&&p!=nullptr)//查询要插入的位置
{
p=p->pNext;
i++;
}
if(i>position-1
[解决办法]
nullptr==p)//如果查询失败,返回false....nullptr==p直接查询现在的指针是否为空!!为空后,后面的肯定不执行!
{
cout<<"置换失败!!"<<endl;
return false;
}
else
{
if(Is_empty(p))//下面都是插入细节
{
cout<<"这是最后一个节点,置换失败"<<endl;
return false;
}
else
{
q->pNext=pHead->pNext;
pHead->pNext=p->pNext;
p->pNext=nullptr;
return true;
}
}
}
#include"stdio.h"
#include"malloc.h"
struct SLNode
{
int data;
struct SLNode * next;
};
class SLList
{
private:
struct SLNode * head;
struct SLNode * tail;
int size;
public:
SLList()
{
size=0;
head=NULL;
tail=NULL;
}
SLList(int SIZE)
{
size=SIZE;
SLNode * p,*q,*s;
s=(SLNode *)malloc(sizeof(SLNode));
scanf("%d",&(s->data));
s->next=NULL;
tail=s;
p=s;
for(int i=0;i<size-1;i++)
{
q=(SLNode *)malloc(sizeof(SLNode));
scanf("%d",&(q->data));
s->next=q;
s=q;
tail=q;
}
head=p;
}
int getsize(){return size;}
struct SLNode * gethead(){return head;}
struct SLNode * gettail(){return tail;}
void sethead(SLNode * h){ this->head=h;}
void settail(SLNode * t){ this->tail=t; tail->next=NULL;}
void setsize(int s){this->size=s;}
};
void cut(SLList &right,int pos,SLList &left)
{
int size;
size=right.getsize();
if(size<pos)
{
printf("错误的位置");
}
SLNode *p,*s;
p=right.gethead();
for(int i=0;i<pos;i++)
{
s=p;
p=p->next;
}
left.sethead(p);
left.settail(right.gettail());
left.setsize(size-pos);
right.settail(s);
}
void cat(SLList &former,SLList later)
{
int size1=former.getsize();
int size2=later.getsize();
int size=size1+size2;
former.setsize(size);
SLNode * p,*q,*s;
p=former.gettail();
q=later.gethead();
p->next=q;
s=later.gettail();
former.settail(s);
}
int main()
{
SLList list(10);
SLList list1;
SLNode * Head=list.gethead();
int size=list.getsize();
SLNode *p=Head;
for(int i=0;i<size;i++)
{
printf("%d->",p->data);
p=p->next;
}
printf("\n");
cut(list,4,list1);
cat(list1,list);
SLNode *Head1=list1.gethead();
while(Head1!=NULL)
{
printf("%d->",Head1->data);
Head1=Head1->next;
}
}