#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; void InitList(LinkList &l); void Create_head(LinkList &l); void Create_rear(LinkList &l); void Output(LinkList &l); LNode *Pos(LinkList &l,int i); void DelList(LinkList &l,int i,ElemType &e); void InsertList(LinkList &l,int i,ElemType e); LNode *Get(LinkList &l,ElemType key); LinkList MergeList(LinkList &La,LinkList &Lb); int ListLength(LinkList l); void ShowMenu() { printf("——————————————————————————————\n"); printf("1、初始化一个单链表\n"); printf("2、用头插法建立一个单链表\n"); printf("3、用尾插法建立一个单链表\n"); printf("4、输出该顺序表\n"); printf("5、求该单链表的长度\n"); printf("6、向该顺序表插入元素\n"); printf("7、对该顺序表删除元素\n"); printf("8、按值查找\n"); printf("9、按位置查找\n"); printf("10、合并两个单链表\n"); printf("0、退出\n"); printf("——————————————————————————————\n"); } int main() { ShowMenu(); LinkList l; int n; while(1) { printf("请输入你要操作的元素序号:"); scanf("%d",&n); /*if(n==0) exit(0);*/ switch(n) { case 1: { InitList(l); break; } case 2: { printf("请依次输入数据,并以-1作为结束标记:\n"); Create_head(l); break; } case 3: { printf("请依次输入数据,并以-1作为结束标记:\n"); Create_rear(l); break; } case 4: { Output(l); break; } case 5: { printf("len:%d\n",ListLength(l)); break; } case 6: { printf("Insert----------------------\n"); int m,i; printf("请依次输入你要插入的位置和元素:"); scanf("%d %d",&i,&m); InsertList(l,i,m); break; } case 7: { printf("Del--------------\n"); ElemType e; int j; printf("请依次输入你要删除的位置:"); scanf("%d",&j); DelList(l,j,e); break; } case 8: { printf("请输入你要查找的值:"); int i; scanf("%d",&i); LNode *q = Get(l,i); if(q->next) printf("该值的下一个位置的值为:%d\n",q->next->data); else printf("该值无下一位\n"); break; } case 9: { printf("请输入你要查找的位置:"); int k; scanf("%d",&k); LNode *q = Pos(l,k); printf("该位置的值为:%d\n",q->data); break; } case 10: { printf("Merge-----------------\n"); LinkList l1,l2; InitList(l1); InitList(l2); printf("利用尾插法建立两个有序单链表:\n"); Create_rear(l1); Create_rear(l2); LNode *p = MergeList(l1,l2); printf("输出合并以后的链表:"); Output(p); break; } case 0:{ exit(0); break; } default:{ printf("非法的数字序号!\n"); } } } return 0; } void InitList(LinkList &l) { l = NULL; } void Create_rear(LinkList &l) { int m; LNode *p = NULL; while(1) { scanf("%d",&m); if(m==-1) break; LNode *s= new LNode; s->data = m; s->next = NULL; if(p) { p->next = s; //p = p->next; } else { l=s; //p = s; } p = s; } } void Create_head(LinkList &l) { int m; while(1) { scanf("%d",&m); if(m==-1) break; LNode *s= new LNode; s->data = m; s->next = l; l = s; } } LNode *Pos(LinkList &l,int i) { if(i<0) { printf("非法的寻找位置!\n"); return NULL; } if(i==0) return l; LNode *p = l; while(--i) { p = p->next; if(p==NULL) { printf("寻找位置已超过链表长度\n"); break; } } return p; } void DelList(LinkList &l,int i,ElemType &e) { LNode *p,*q=NULL; p = Pos(l,i-1); if(p==l) { l= p->next; delete p; } if(p!=NULL && p->next!=NULL) { q = p->next; p->next = q->next; delete q; } } void InsertList(LinkList &l,int i,ElemType e) { LNode *p,*s; p = Pos(l,i); s = new LNode; s->data = e; s->next = p->next; p->next = s; } LNode *Get(LinkList &l,ElemType key) { Node *p; p = l; while(p) { if(p->data != key) p = p->next; else break; } return p; } int ListLength(LinkList l) { LNode *p = l; int len=0; while(p) { len++; p = p->next; } return len; } LinkList MergeList(LinkList &La,LinkList &Lb) { LNode *pa,*pb; LinkList Lc; pa = La; pb = Lb; Lc = NULL; if(La->data <= Lb->data) { Lc = La; pa = pa->next; } else { Lc = Lb; pb = pb->next; } LNode *r = Lc; //尾指针 while(pa &&pb) { if(pa->data<=pb->data) { r->next = pa; //r = pa; pa = pa->next; } else { r->next = pb; //r = pb; pb = pb->next; } r = r->next; r->next = NULL; } if(pa) r->next = pa; else r->next = pb; return Lc; } void Output(LinkList &l) { LNode *p; p=l; while(p) { printf("%d ",p->data); p = p->next; } printf("\n"); }
原文地址:http://blog.csdn.net/huolang_vip/article/details/45009947