数据结构-线性表

来源:互联网 发布:冥王星的早餐知乎 编辑:程序博客网 时间:2024/06/05 09:51

(1)将两个递增的有序链表合并为一个递增的有序链表。

要求结果链表仍使用原来两个链表的存储空间,

不另外占用其它的存储空间。表中不允许有重复的数据。

#include<iostream>#include<string>#include<iomanip>#include<fstream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef struct LNode {int data; //结点的数据域struct LNode *next; //结点的指针域} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型void MergeList(LinkList &LA,LinkList &LB,LinkList &LC){//合并后的新表使用头指针Lc指向LinkList pa,pb,pc;pa = LA->next;pb = LB->next;LC = LA;pc = LC;while(pa&&pb){if(pa->data < pb->data){pc->next = pa;pc = pa;pa = pa->next;} else if(pa->data == pb->data){pc->next = pa;pc = pa;pa = pa->next;pb = pb->next;} else {pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb;delete LB;}int InitList_L(LinkList &L) {//构造一个空的单链表LL = new LNode; //生成新结点作为头结点,用头指针L指向头结点L->next = NULL; //头结点的指针域置空return OK;}void create_list(LinkList &L,int x){int i;int len;int val;LinkList p;LinkList q;q = L;cout<<"请输入你想要生成的链表"<<x<<"节点的个数:len=";cin>>len;for(i = 0;i<len;i++){cout<<"请输入第"<<i+1<<"个节点的值:";cin>>val;p = new LNode;p->data = val;p->next = NULL;q->next = p;q = p;}cout<<"\n";}void print(LinkList L){LinkList p;p = L->next;while(p){cout<<p->data<<"\t";p = p->next;}cout<<"\n";}int main(){int len;LinkList La,Lb,Lc;InitList_L(La);InitList_L(Lb);create_list(La,1);print(La);create_list(Lb,2);print(Lb);MergeList(La,Lb,Lc);print(Lc);return 0;}
(2)将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间。表中允许有重复的数据。

#include<iostream>#include<string>#include<iomanip>#include<fstream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef struct LNode {int data; //结点的数据域struct LNode *next; //结点的指针域} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型void MergeList(LinkList &LA,LinkList &LB,LinkList &LC){//合并后的新表使用头指针Lc指向LinkList pa,pb,pc,q;pa = LA->next;pb = LB->next;LC = LA;pc = LC;while(pa||pb){if(!pa){q = pb;pb = pb->next;}else if(!pb){q = pa;pa = pa->next;}else if(pa->data <= pb->data){q = pa;pa = pa->next;} else {q = pb;pb = pb->next;}q->next = LC->next;LC->next = q;}delete LB;}int InitList_L(LinkList &L) {//构造一个空的单链表LL = new LNode; //生成新结点作为头结点,用头指针L指向头结点L->next = NULL; //头结点的指针域置空return OK;}void create_list(LinkList &L,int x){int i;int len;int val;LinkList p;LinkList q;q = L;cout<<"请输入你想要生成的链表"<<x<<"节点的个数:len=";cin>>len;for(i = 0;i<len;i++){cout<<"请输入第"<<i+1<<"个节点的值:";cin>>val;p = new LNode;p->data = val;p->next = NULL;q->next = p;q = p;}cout<<"\n";}void print(LinkList L){LinkList p;p = L->next;while(p){cout<<p->data<<"\t";p = p->next;}cout<<endl<<endl;}int main(){int len;LinkList La,Lb,Lc;InitList_L(La);InitList_L(Lb);create_list(La,1);cout<<"链表La:";print(La);create_list(Lb,2);cout<<"链表Lb:";print(Lb);MergeList(La,Lb,Lc);cout<<"链表Lc:";print(Lc);return 0;}


(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

#include<iostream>#include<string>#include<iomanip>#include<fstream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef struct LNode {int data; //结点的数据域struct LNode *next; //结点的指针域} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型int Max(LinkList L){if(L->next==NULL) return 0;LinkList pmax,p;pmax = L->next;p = pmax->next;while(p != NULL){if(p->data > pmax->data){pmax = p;}p = p->next;}return pmax->data;}void create_list(LinkList &L){int i;int len;int val;LinkList p;LinkList q;q = L;cout<<"请输入你想要生成的链表节点的个数:len=";cin>>len;for(i = 0;i<len;i++){cout<<"请输入第"<<i+1<<"个节点的值:";cin>>val;p = new LNode;p->data = val;p->next = NULL;q->next = p;q = p;}cout<<"\n";}void print(LinkList L){LinkList p;p = L->next;while(p){cout<<p->data<<"\t";p = p->next;}cout<<endl<<endl;}int InitList_L(LinkList &L) {//构造一个空的单链表LL = new LNode; //生成新结点作为头结点,用头指针L指向头结点L->next = NULL; //头结点的指针域置空return OK;}int main(){LinkList L;InitList_L(L);create_list(L);cout<<"L:"; print(L);cout<<"MAX:"<<Max(L)<<endl;return 0;}

(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。

#include<iostream>#include<string>#include<iomanip>#include<fstream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef struct LNode {int data; //结点的数据域struct LNode *next; //结点的指针域} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型void inverse(LinkList &L){//逆序链表LinkList p,q;p = L->next;L->next = NULL;while(p){q = p->next;p->next = L->next;L->next = p;p = q;} }void create_list(LinkList &L){int i;int len;int val;LinkList p;LinkList q;q = L;cout<<"请输入你想要生成的链表节点的个数:len=";cin>>len;for(i = 0;i<len;i++){cout<<"请输入第"<<i+1<<"个节点的值:";cin>>val;p = new LNode;p->data = val;p->next = NULL;q->next = p;q = p;}cout<<"\n";}void print(LinkList L){LinkList p;p = L->next;while(p){cout<<p->data<<"\t";p = p->next;}cout<<endl<<endl;}int InitList_L(LinkList &L) {//构造一个空的单链表LL = new LNode; //生成新结点作为头结点,用头指针L指向头结点L->next = NULL; //头结点的指针域置空return OK;}int main(){LinkList L;InitList_L(L);create_list(L);cout<<"逆序前:"; print(L);inverse(L);cout<<"逆序后:";print(L); return 0;}

(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。

#include<iostream>#include<fstream>#include<string>#include<iomanip>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2#define MAXSIZE 100//顺序表可能达到的最大长度typedef struct {int data[MAXSIZE]; //存储空间的基地址int length; //当前长度} SqList;int InitList_Sq(SqList &L) { //构造一个空的顺序表LL.length = 0; //空表长度为0return OK;}void create_list(SqList &L){//输入生成顺序表 int i;int len;int val;cout<<"请输入你想要生成的顺序表节点的个数:len=";cin>>len;for(i = 0;i<len;i++){cout<<"请输入第"<<i+1<<"个节点的值:";cin>>val;L.data[i] = val;}L.length = len;cout<<"\n";}void print(SqList L){int i;for(i = 0;i<L.length;i++){cout<<L.data[i]<<"\t";}cout<<endl<<endl;}void deleteItem(SqList &L,int item){//删除顺序表中的item int i = 1,j = 1;while(i < L.length) {if(L.data[i] == item)i++;else{L.data[j] = L.data[i];i++;j++;}}L.length = j;}int main(){SqList L;int item;InitList_Sq(L);create_list(L);cout<<"删除前:";print(L);cout<<"请输入要删除的item:"; cin>>item;deleteItem(L,item);cout<<"删除后:";print(L);return 0;}


参考文献:数据结构(C语言版|第二版);人民邮电出版社。

原创粉丝点击