中文网站建设工具,做网站建设的价格,河南国基建设集团--官方网站,靖江做网站哪家好1、设有两个整型顺序表L1#xff0c;L2#xff0c;其元素值递增有序存放#xff0c;请定义该顺序表的元素类型及表类型,设计以下自定义函数#xff1a;
#xff08;1#xff09;录入顺序表中所有元素的值。
#xff08;2#xff09;将顺序表L1#xff0c;L2合并为到…1、设有两个整型顺序表L1L2其元素值递增有序存放请定义该顺序表的元素类型及表类型,设计以下自定义函数
1录入顺序表中所有元素的值。
2将顺序表L1L2合并为到另外一个顺序表L3中L3中的元素非递减有序排列。
3输出顺序表中元素的值。
主函数通过调用以上函数实现两个表的合并并显示合并结果。 #includestdio.h #includestdlib.h #define MAXLEN 100 typedef struct { int data[MAXLEN1]; int len; }SeqList; /*录入*/ void input(SeqList*L) { int i; printf(input the length\n); scanf(%d,L-len); printf(input element\n); for(i1;iL-len;i) scanf(%d,L-data[i]); } /*合并*/ void merge(SeqList* A , SeqList* B, SeqList *C) { int i,j,k; i1;j1;k1; while(iA-lenjB-len) if(A-data[i]B-data[j]) C-data[k]A-data[i]; else C-data[k]B-data[j]; while(iA-len) C-data[k]A-data[i]; while(jB-len) C-data[k]B-data[j]; C-lenk-1; } /*显示*/ void output(SeqList*L) { int i; for(i1;iL-len;i) printf(%5d\n,L-data[i]); } /*菜单*/ void menu() { printf(1-------------表1录入\n); printf(2-------------表2录入\n); printf(3-------------合并\n); printf(4-------------输出合并后的表\n); printf(0-------------退出\n); } int main() { SeqList* L1,*L2,*L3; int sel; L1(SeqList*)malloc(sizeof(SeqList)); L1-len0; L2(SeqList*)malloc(sizeof(SeqList)); L2-len0; L3(SeqList*)malloc(sizeof(SeqList)); L3-len0; do { menu(); printf(input your select\n); scanf(%d,sel); switch(sel) { case 1: printf(input list1\n); input(L1); break; case 2: printf(input list2\n); input(L2); break; case 3:merge(L1,L2,L3); break; case 4:output(L3); } }while(sel!0); return 0; }
2、顺序表两个表合成一个新表并排序
#include stdio.h #include stdlib.h #define DataType int //此处假设顺序表的元素基类型为int #define MAXSIZE 50 //此处假设顺序表的最大元素个数为50 typedef struct List { DataType data[MAXSIZE]; //用一维数组存储顺序表元素 int size; //线性表的长度 }SeqList;
void InitList(SeqList *p)//顺序表的初始化 { p-size0; }
int Locate(SeqList *p, DataType e) { int i0; while(ip-sizep-data[i]!e) { i; } if(ip-size) return 0; else return(i1); }
void InsertList(SeqList *p,int i,DataType e)//插入 { int j; if(i1||ip-size1) printf(插入位置不正确); else { p-size; for(jp-size-1;ji;j--)//此处的size已是修改后的新值 p-data[j]p-data[j-1]; p-data[i-1]e; } } void DeleteList(SeqList *p,int i) //其实删除的是下标i-1的元素 { int j ; if (i1|| ip-size) printf( 删除位置不正确); else { for(ji-1;jp-size-1;j) p-data[j]p-data[j1]; p-size--; } } void Display(SeqList *p)//输出顺序表 { int j; if(p-size0) printf(表为空表\n); else for(j0;jp-size;j) printf(%d ,p-data[j]); } void Bubble(SeqList *p)//升序冒泡 { int i,j; int t; for(i0;ip-size-1;i) for(ji1;jp-size;j) if(p-data[j]p-data[i]) { tp-data[i]; p-data[i]p-data[j]; p-data[j]t; } } void Bubbles(SeqList *p)//降序冒泡 { int i,j; int t; for(i0;ip-size-1;i) for(ji1;jp-size;j) if(p-data[j]p-data[i]) { tp-data[i]; p-data[i]p-data[j]; p-data[j]t; } } int main() { SeqList A{{0,2,4,6,7,9},5},B{{0,1,5,7,8},4},C; //第一个位置不用然后花括号外面是表长 int i,j; InitList(C); for(i1;iA.size;i) InsertList(C,i,A.data[i]); for(j1;jB.size;j) if(Locate(A,B.data[j])0) InsertList(C,i,B.data[j]); Display(C); printf(表长%d\n,C.size); printf(\n); printf(升序排列); Bubble(C); Display(C); printf(\n降序排列); Bubbles(C); Display(C); return 0; }
3、顺序表合成被调函数直接返回新表
#includeStdio.h typedef struct A { int data[10]; int len; }SeqList; SeqList fun(SeqList *p1, SeqList *p2) { int i,j; SeqList p; p.lenp1-lenp2-len; for(i0,j0;ip1-len;i) p.data[j]p1-data[i]; for(i0;ip2-len;i) p.data[j]p2-data[i]; return p; //值带回p的空间释放 } void main() { int i; SeqList a{{1,2,3},3},b{{5,6,7,8,9},5},p; //p是一个实体对象有自己空间 pfun(a,b); //返回值赋值给变量p for(i0;ip.len;i) // 正确显示了返回的合并新表的值 printf(%d ,p.data[i]); }
4、顺序表合成使用二级指针,带回新表
#include stdio.h #include stdlib.h typedef struct { int data[10]; int len; }SeqList; void fun(SeqList *p1, SeqList *p2, SeqList **p3) { int i,j; *p3(SeqList*)malloc(sizeof(SeqList)); (*p3)-lenp1-lenp2-len; for(i0,j0;ip1-len;i) (*p3)-data[j]p1-data[i]; for(i0;ip2-len;i) (*p3)-data[j]p2-data[i]; } //二级指针p3中存放实参指针的地址申请的堆空间地地址 //直接写入实参指针变量p中因而返回后访问堆空间的值是正确的 int main( ) { int i; SeqList a{{1,2,3},3},b{{5,6,7,8,9},5},*pNULL; fun(a,b,p); //这里使用了指针的指针做实参 for(i0;ip-len;i) // 正确显示了返回的合并新表的值 printf(%d ,p-data[i]); return 0; }
5、顺序表合成使用静态局部变量返回其内存地址给主调方
#includestdio.h #includestdlib.h typedef struct A { int data[10]; int len; }SeqList; SeqList* fun(SeqList *p1,SeqList *p2) { int i,j; static SeqList p; p.lenp1-lenp2-len; for(i0,j0;ip1-len;i) p.data[j]p1-data[i]; for(i0;ip2-len;i) p.data[j]p2-data[i]; return p; //返回函数中静态局部变量申请的空间地址 } void main() { int i; SeqList a{{1,2,3},3},b{{5,6,7,8,9},5},*p; pfun(a,b); //将返回地址赋值给主调方的指针变量 for(i0;ip-len;i) // 正确显示结果 printf(%d ,p-data[i]); } //静态申请的空间释放
6、顺序表合成被调函数返回顺序表指针带回新表地址
#includestdio.h #includestdlib.h typedef struct A { int data[10]; int len; }SeqList; SeqList* fun(SeqList *p1,SeqList *p2) { int i,j; SeqList *p; p(SeqList*)malloc(sizeof(SeqList)); p-lenp1-lenp2-len; for(i0,j0;ip1-len;i) p-data[j]p1-data[i]; for(i0;ip2-len;i) p-data[j]p2-data[i]; return p; //带回指针变量的值指针变量p的空间释放 } int main() { int i; SeqList a{{1,2,3},3},b{{5,6,7,8,9},5},*p; pfun(a,b); //返回的地址给了指针变量p for(i0;ip-len;i) // 正确显示了返回的合并新表的值 printf(%d ,p-data[i]); return 0; }
7、堆排序
#includestdio.h #define MAXSIZE 100 typedef struct { int key; }DataType; typedef struct { DataType list[MAXSIZE]; int length; }SeqList; void HeapAdjust(SeqList *L,int low,int high) { int i, j; ilow; j2*i; L-list[0]L-list[i]; for(;jhigh;j*2) { if(jhighL-list[j].keyL-list[j1].key) j; if(L-list[0].keyL-list[j].key) break; else { L-list[i]L-list[j]; ij; } } L-list[i]L-list[0]; } void HeapCreate(SeqList *L) { int i, n; nL-length; for(in/2;i0;i--) HeapAdjust(L,i,n); } void HeapSort(SeqList *L) { int i, nL-length; HeapCreate(L); for(in;i1;i--) { L-list[0]L-list[1]; L-list[1]L-list[i]; L-list[i] L-list[0]; HeapAdjust(L,1,i-1); } } int main() { SeqList L{{0,18,27,10,8,18,38,4,17,21},10}; HeapCreate(L); HeapSort(L); int i; for(i1;i10;i) { printf(%d ,L.list[i].key); } return 0; }
8、快速排序
#includestdio.h #define MAXSIZE 100 typedef struct { int key; }DataType; typedef struct { DataType list[MAXSIZE]; int length; }SeqList; int QuickPass(SeqList *L,int low,int high) { int i,j; ilow; jhigh; L-list[0]L-list[i]; while(i!j) { while((L-list[j].keyL-list[0].key)(ij)) j--; if(ij) { L-list[i]L-list[j]; i; } while((L-list[i].keyL-list[0].key)(ij)) i; if(ij) { L-list[j]L-list[i]; j--; } } L-list[i]L-list[0]; return i; } void QuickSort(SeqList *L,int s,int t) { int i; if(st) { iQuickPass(L,s,t); QuickSort(L,s,i-1); QuickSort(L,i1,t); } } int main() { //SeqList L{{0,38,20,46,38,74,91,25,12},9}; SeqList L{{0,18,27,10,8,19,38,4,17,21},10}; QuickSort(L,1,10); int i; for(i1;i10;i) { printf(%d ,L.list[i].key); } return 0; }
9、直接插入排序
void ins_sort(int R[ ],int *nint x) { int i; R[0]x; i*n; while( R[0]R[i]) { R[i1]R[i]; i--; } R[i1]R[0]; (*n); }
10.写出用直接插入排序进行升序排序的算法
void ins_sortdatatype R[ ],int n { int i; for( i2;in;i) { R[0]R[i]; ji-1; while( R[0].keyR[j].key ) { R[j1]R[j] ; j- -; } R[j1]R[0] ; } }
10、//给定一组整型值-1作为结束写出二叉排序树的生成过程。 void insert(BiTree t, Bstree * s) //将s插入到t为根的二叉排序树中 { if(s-datat-data) { if (t-lchildNULL) t-lchilds; else insert(t-lchild,s); } else { if (t-rchildNULL) t-rchilds; else insert(t-rchild,s); } } Bstree* bstreecreate() /*二叉排序树的生成算法*/ { int x; Bstree *s,*t; tNULL; printf(input the elements of bstree,end flag is -1\n); scanf(%d,x); while(x!-1) { s(BiTNode*)malloc(sizeof(BiTNode)); s-datax; s-lchilds-rchildNULL; if (tNULL) ts; else insert(t,s); scanf(%d,x); } return (t); }
11、哈希查找#include stdio.h #include stdlib.h #define NULLKEY 0 #define DELKEY -1 typedef struct { int key; }Haxi; int Hash(int k) { int i; ik%97; return i; } int InsertHash(Haxi ht[],int m,int k) { int h0,hi,di; h0Hash(k); hih0; di1; while(ht[hi].key!NULLKEYht[hi].key!DELKEYht[hi].key!kdim) { hi(h0di)%m; di; } if(ht[hi].key!kdim) { ht[hi].keyk; return 1; } else { if(ht[hi].keyk) printf(元素%d已经存在\n,k); else printf(哈希表已满\n); return 0; } } void CreateHash(Haxi ht[],int m) { int endflag-99999; int i,x; for(i0;im;i) { ht[i].keyNULLKEY; } printf(请输入哈希表中各个元素的值以endflag-99999结束\n); scanf(%d,x); while(x!endflag) { InsertHash(ht,m,x); scanf(%d,x); } } int SearchHash(Haxi ht[],int m,int k) { int h0,hi,di; h0Hash(k); hih0; di1; while(ht[hi].key!NULLKEYht[hi].key!kdim) { hi(h0di)%m; di; } if(ht[hi].keyk) return hi; else return -1; } int DeleteHash(Haxi ht[],int m,int k) { int i; iSearchHash(ht,m,k); if(i!-1) { ht[i].keyDELKEY; return 1; } else return 0; } int main() { //测试数据:62 30 18 45 21 78 66 32 54 48 -99999 Haxi ht[100]; int i,j; int huanhang0; CreateHash(ht,100); int number; int q; do { printf(请输入你想进行的操作:\n1.查看哈希表\n2.查找哈希表中的元素\n3.删除哈希表中的元素\n0.退出\n); scanf(%d,q); switch(q) { case 1: printf(下面是建立的哈希表\n\n); for(i0;i99;i) { printf(%d ,ht[i].key); huanhang; if(huanhang%100) { printf(\n); } } break; case 2: printf(请输入你想查找的元素:\n); scanf(%d,number); jSearchHash(ht,100,number); if(j-1) { printf(查找失败该元素不存在!\n\n); }else printf(元素%d在第%d个位置上,number,j); break; case 3: printf(请输入你想删除的元素:); int delnumber; int sign; scanf(%d,delnumber); signDeleteHash(ht,100,delnumber); if(sign1) { printf(删除成功该元素所在位置置为0\n); }else printf(查找失败该元素不存在\n); break; } }while(q); return 0; }
11、v单链表操作
#include stdio.h #include stdlib.h #define N 0 typedef struct { int sno; char name[20]; }DataType; typedef struct Node { DataType data; struct Node *next; }LNode,*LinkList; LNode * InitL( )//初始化从无到有 { LNode *headNULL; head(LNode*)malloc(sizeof(LNode)); if(head!NULL) head-nextNULL; return head; } LNode* CreatLinkH (LNode *head, int n) { LNode *s; DataType x; int k0; while(kn) { scanf(%d%s,x.sno,x.name); s(LNode*)malloc(sizeof(LNode)); /*为新结点s申请空间*/ s-datax; /*给新结点的数据域赋值*/ s-nexthead-next;/*将新结点链到首元结点之前*/ head-nexts; /*将新结点链到头结点之后*/ k; } return head; } void display(LNode *head)//显示带头结点的单链表的所有信息 { LNode *p; phead-next;//P指向了第一个数据结点 while(p!NULL)//说明 p指向了一个实际的数据结点 { printf(%5d%10s\n,p-data.sno,p-data.name);//输出该结点的值 pp-next;//p下移到下一个结点 } printf(\n); } /* LNode * SearchL(LNode *head, DataType x)//返回找到结点的地址 { LNode *p; phead-next; //从第一个结点开始找 while(p!NULL p-data!x ) //逐个往后查找 { pp-next;} return p; } */ LNode * Search_i(LNode *head, int i)//返回第i个结点的直接前驱结点 { LNode *p; int k0; phead; //从第一个结点开始找 while(p ki-1 ) //逐个往后查找 { k; pp-next; } if(pNULL||i1) return NULL; return p; } void Insert_i(LNode *head, int i) { LNode *p,*s; pSearch_i(head, i); if(p) { s(LNode*)malloc(sizeof(LNode)); /*为新结点s申请空间*/ scanf(%d%s,s-data.sno,s-data.name); s-nextp-next; p-nexts; } } void DeleteL_i(LNode *head, int i) { LNode *p,*s; pSearch_i(head, i); if(pNULL) printf(查无此值\n); else if(p-next!NULL) { sp-next; p-nexts-next; free(s); } } LNode * SearchL_2(LNode *head, DataType x)//返回找到结点的位置号 { LNode *p; phead-next; //从第一个结点开始找 while(p!NULL p-data.sno!x.sno ) //逐个往后查找 { pp-next;} return p; } int count_len(LNode *head)//返回找到结点的位置号 { LNode *p; int n0; phead-next; //从第一个结点开始找 while(p!NULL ) //逐个往后查找 { n; pp-next;} return n; } int main() { LNode *headNULL,*p; DataType x; int i; headInitL(); headCreatLinkH(head,N);//头插法建立链表 display(head); // scanf(%d,x.sno); // pSearch_i(head, i);
/* if(pNULL) printf(查无此值\n); else if(phead) printf(是头结点\n); else printf(%5d%10s\n,p-data.sno,p-data.name); Insert_i(head,i); display(head); DeleteL_i(head,i); display(head); pSearchL_2(head, x); if(p) printf(%5d%10s\n,p-data.sno,p-data.name); else printf(查无此值\n); */ printf(长度%d\n,count_len(head)); return 0; }
12双向链表
#include stdio.h #include stdlib.h #include string.h typedef struct { int sno; char sex[3]; char name[20]; }DataType; typedef struct DNode { DataType data; struct DNode *prior,*next; }DNode,*DuLinklist; void CrtlinkR(DNode **head,int n)/*创建长度为n的双向链表*/ { int i; DNode *p,*rear; *head(DNode *)malloc(sizeof(DNode)); rear*head; (*head)-priorNULL; printf(input data:\n); for(i1;in;i) { p(DNode*)malloc(sizeof(DNode)); scanf(%d%s%s,p-data.sno,p-data.sex,p-data.name); rear-nextp; p-priorrear; rearp; } rear-nextNULL; } void serch_i_2(DNode *head,int i) { DNode *p,*s,*t; int k0; phead; while(pki) { k;pp-next; } if(i3||pNULL||p-priorNULL||p-prior-priorNULL) printf(向前无第2个结点\n); else { sp-prior-prior; printf(%5d %5s %10s\n,s-data.sno,s-data.sex,s-data.name); } if(pNULL||p-nextNULL||p-next-nextNULL) printf(向后无第2个结点\n); else { tp-next-next; printf(%5d %5s %10s\n,t-data.sno,t-data.sex,t-data.name); } } void dispheady(DNode *head) { DNode *p; phead; while(p-next!NULL) { printf(%5d %5s %10s\n,p-next-data.sno,p-next-data.sex,p-next-data.name); pp-next; } printf(\n); } /* int dLinkdel(DuLinklist L,int i) { DNode *p,*s; int j; pL; j0; while(p!NULLji) { pp-next; j; } if(j!i||i1) { printf(删除位置不正确\n); return 0; } sp ; printf(p-data%d\n,p-data); p-prior-nextp-next; if(p-next!NULL) p-next-priorp-prior; free(s); return 1; } */ void fun(DNode *head,DNode **M,DNode **F) { DNode *p,*rf,*rm,*s; CrtlinkR(M,0); CrtlinkR(F,0); rf*F; rm*M; phead-next; while(p) { if(strcmp(p-data.sex,男)0) { s(DNode *)malloc(sizeof(DNode)); s-datap-data; s-priorrf; s-nextrf-next; rf-nexts; rfs; } else { s(DNode *)malloc(sizeof(DNode)); s-datap-data; s-priorrm; s-nextrm-next; rm-nexts; rms; } pp-next; } } void fun_2(DNode *head,DNode **M,DNode **F)//拆男生和女生 { DNode *p,*rf,*rm,*s; CrtlinkR(M,0); *Fhead; rf*F; rm*M; phead-next; while(p) { if(strcmp(p-data.sex,男)0) { sp; pp-next; s-nextrf-next; rf-nexts; rfs; } else { sp; pp-next; s-nextrm-next; rm-nexts; rms; } } rf-nextNULL; rm-nextNULL; } int main() { DNode *head,*Mhead,*Fhead; int i,k; CrtlinkR(head,5); /*新建一个长度为5的双向链表*/ dispheady(head); /*显示双向链表*/ /* ilocate(head,2); //查找数据4所在位置 printf(%d\n,i); kdLinkdel(head,i);//删除第i个数据 if(k1) //删除成功则显示插入后双向链表 { printf(已正确删除了第%d个结点\n,i); dispheady(head); } else printf(位置不正确不能删除\n); scanf(%d,i); serch_i_2(head,i);*/ fun_2(head,Mhead,Fhead); dispheady(Mhead); dispheady(Fhead); dispheady(head); return 0; }
13树
//1. 设计一算法统计二叉树中度为2的结点总数。 int count(Bstree* bt) { if(btNULL) return 0; if(bt-lchild!NULLbt-rchild!NULL) return 1; else return(count(bt-lchild)count(bt-rchild)); }
//3. 设计一算法统计叶子结点总数。 int countleaf1(Bstree* bt) { if(btNULL) return 0; if(bt-lchildNULL bt-rchildNULL) return 1; else return(countleaf1(bt-lchild)countleaf1(bt-rchild)); }
//写出在二叉排序树中进行查找的算法。 BiTNode* SearchData(BiTree t, KeyType kx) /*在二叉排序树t上查找关键码为kx的元素,找到返回其所在及结点的指针否则返回一个空指针 */ { BiTNode* qt; while(q) { if(kxq-data.key) qq-rchild; /* 在右子树中查找 */ else if (kxq-data.key) qq-lchild; /* 在左子树中查找 */ else return q; /* 查找成功 */ } return NULL; /* 查找不成功 */ }
中序遍历
typedef struct node { int data; struct node *lchild,*rchild; }Bstree; void bianli(Bstree* bt) { if (bt!NULL) { bianli(bt-rchild); printf(%5d,,bt-data); bianli(bt-lchild); } }
二叉树判断完全二叉树源代码typedef struct { char data[10]; int front; int rear; }SeqQueue; /* void initqueue(SeqQueue *q) { q-frontq-rear0; } int enqueue(SeqQueue *q,char x) { if(q-rear10) { printf(队满\n); } else { q-data[q-rear]x; q-rear; return 1; } return 0; } int dequeue(SeqQueue *q,char *x) { if(q-frontq-rear) { printf(队空); return 0; } else { *xq-data[q-front]; q-front; return 1; } } /* void complete(BiTree root) { SeqQueue p; BiTree qroot; initqueue(p); if(q!NULL) { enqueue(amp;p,*q); while(p.frontlt;p.rear) { dequeue(amp;p,q); printf(%c,q); if(q-lchild!NULL) enqueue(amp;p,*(q-lchild)); if(q-rchild!NULL) enqueue(amp;p,*(q-rchild)); } } } */ /* bool Judge_Complete(BiTree T)//判断二叉树是否是完全二叉树 { BiTree t; SeqQueue Q; //创建一个空队列 initqueue(Q); enqueue(Q,T); //将T的头结点入队 t T; //给t赋初值T根节点 if(TNULL) return false; while(QueueLength(Q)) { if(t-lchildNULL t-rchild!NULL) return false; if(t-lchild!NULL t-rchild!NULL)//左右孩子都不为空 { dequeue(Q,t);//删除该双亲节点 enqueue(Q,t-lchild); //将左孩子入队 enqueue(Q,t-rchild); //将右孩子入队 } if((t-lchild!NULL t-rchildNULL) || (t-lchildNULL t-rchildNULL)) { dequeue(Q,t); //从刚才判断的节点的下一个节点一次判断剩下队列中的节点是否左右子树都为空 while(QueueLength(Q)) { if(t-lchildNULL t-rchildNULL) dequeue(Q,t); else return false; } return true; } } return true; } */ 在顺序表中进行二分查找的递归算法int BSearch(S_TBL *tbl,keytype kxint low,int high) //在下界为low上界为high的线性表tbl中折半查找关键字为k的元素 { int mid(lowhigh)/2; if(lowhigh) return -1; if(ktbl-data[mid].key) return mid; if(k tbl-data[mid].key) return(BSearch(tbl,k,low,mid-1)); return(BSearch(tbl,k,mid1,high)); }
折半查找
#includestdio.h #define MAXSIZE 100 #define KeyType int typedef struct STUDENTS { char name[10]; int grade; }stu;
typedef struct { stu data[MAXSIZE1]; int length; }SeqList;
int Binsearch(SeqList *L,KeyType x) { int low,mid,high; low1; highL-length; while(lowhigh) { mid(lowhigh)/2; if(L-data[mid].gradex) return mid; else if(L-data[mid].gradex) lowmid1; else highmid-1; } return 0; } int main() { SeqList m{ { {,0}, {张三,60}, {李四,70}, {王五,80}, {老六,90}}, 4}; int searchgrade; int location; printf(请输入你想要查找的成绩:\n); scanf(%d,searchgrade); locationBinsearch(m,searchgrade); if(location!0) { printf(%s,m.data[location].name); } else{ printf(查无此人); } return 0; }
有两个链表表示的集合设计算法判断是否相等源代码
// 判断两个链表表示的集合是否相等 int Equal(LinkList h1,LinkList h2) { LNode *p,*q; int t10,t20; ph1-next; qh2-next; while(p) //h1中所有元素是否都在h2 { if(locateLinkList(h2,p-data)) pp-next; else return 0; } if(pNULL) t11; while(q) //h2中所有元素是否都在h1 { if(locateLinkList(h1,q-data)) qq-next; else return 0 ; } if(qNULL) t21; if(t11t21) return 1 ; else return 0; } // // 判断两个有序链表表示的集合是否相等 int Equal(LinkList h1,LinkList h2) { LNode *p,*q; ph1-next;qh2-next; while(pq) //等长且对应元素一一相等 { if(p-data!q-data) return 0; pp-next;qq-next; } if(p||q) return 0; return 1; }
//设计一算法利用单链表中原来的结点将该单链表中元素倒置。即原来的元素如果为12345倒置后变成54321。 void reverse (NodeType * H) { NodeType *p; pH- next; H-nextNULL; while(p) { qp; pp-next; q-nextH-next; H-nextq; } }
10. 设计一算法求该链表中值最大的结点并返回该结点的指针若链表为空则返回一个 空指针。 NodeType* maxpNodeType* L) { NodeType* pL-next,*s; if(p!NULL) { sp; //第一个结点初始化为最大的结点 pp-next; //从第二个开始比较 while(p!NULL) { if(p-datas-data) sp; //s指向当前最大的结点 pp-next; } return s else return NULL }
3. 设计一算法删除单链表中重复的结点。 void pur_LinkList(NodeType * H) { NodeType *p,*q,*r; pH-next; if (pNULL) return while(p-next) { qp; //找与p重复的结点并删除 while(q-next) if (q-next-datap-data) { rq-next; q-nextr-next; free( r ); } else q q -next; pp-next; }