《数据结构与算法基本程序精品资料.doc》由会员分享,可在线阅读,更多相关《数据结构与算法基本程序精品资料.doc(75页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据结构与算法基本程序目录一、线性表及其操作1、尾插法建立一个单链表,并按顺序输出2、单链表的元素查找,按内容查找3、元素插入操作4、按内容元素删除操作5、按位置删除元素6、建立双向链表7、单链表就地逆置8、约瑟夫环问题二、栈及其操作1、建立堆栈2、进栈与出栈3、栈的应用,括号匹配三、队及其操作1、链队列的建立2、入队和出队3、循环队列建立4、循环队列的入队和出队操作四、串及其操作1、串的朴素匹配五、树(二叉树)及其操作1、二叉排序树2、哈夫曼编码六、排序1、冒泡排序2、直接选择排序法一、线性表及其操作/All copyright are preserved by cobby/*尾插法建立一个
2、单链表,并按顺序输出*/#define NULL 0/*宏定义*/typedef struct node/*定义结点类型的数据结构*/char c;/*数据域,类型为字符型*/struct node *next;/*指针域,类型为本结构体类型*/*L;/*类型重定义,即Node和*L和struct node等价*/main()L l,p,q;/*用指针类型定义三个结点类型的指针*/char ch;l=(L)malloc(sizeof(L);/*分配内存空间*/l-c=0;/*为头结点的数据域赋值,值为空*/l-next=NULL;/*指明下一个结点目前不存在*/q=l;/*q为游动指针,链表结
3、点的连结要用*/printf(Input a character:n);scanf(%c,&ch);getchar();/此语句用来吸收键盘输入的回车符,没有其它含义while(ch!=!)/*输入!表示输入结束*/p=(L)malloc(sizeof(L);/*为新输入的数据分配内存空间*/p-c=ch;p-next=NULL;/*新输入的结点在链表的最后,即它的后面没有其它元素*/q-next=p;/*q用于将上一个元素链接至当前新元素*/q=p;/*q自己移到当前最后一个元素,以备继续链接所用*/scanf(%c,&ch);getchar();q=l;/*输入整个链表前,先将q移到链表头
4、,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操作*/All copyright are preserved bycobby/*单链表的元素查找,按内容查找*/#define NULL 0/*宏定义*/typedef struct node/*定义结点类型的数据结构*/char c;/*数据域,类型为字符型*/struct node *next;/*指针域,类型为本
5、结构体类型*/*L;/*类型重定义,即Node和*L和struct node等价*/main()L l,p,q;/*用指针类型定义三个结点类型的指针*/char ch;int n;l=(L)malloc(sizeof(L);/*分配内存空间*/l-c=0;/*为头结点的数据域赋值,值为空*/l-next=NULL;/*指明下一个结点目前不存在*/q=l;/*q为游动指针,链表结点的连结要用*/printf(Input a character:n);scanf(%c,&ch);getchar();while(ch!=!)/*输入!表示输入结束*/p=(L)malloc(sizeof(L);/*为
6、新输入的数据分配内存空间*/p-c=ch;p-next=NULL;/*新输入的结点在链表的最后,即它的后面没有其它元素*/q-next=p;/*q用于将上一个元素链接至当前新元素*/q=p;/*q自己移到当前最后一个元素,以备继续链接所用*/scanf(%c,&ch);getchar();q=l;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个
7、元素重复输出操作*/*-以上为建立一个单链表-*/printf(nInput a character you wanna findn);scanf(%c,&ch);printf(nthe character you wanna find is %cn,ch);q=l-next;/*q移至头结点的后一个元素,即实际第一个数据点*/n=1;/位置计数器while(q!=NULL)/*若q不为空,即该结点存在*/if(q-c=ch)/*字符匹配*/printf(character found in position %dn,n);q=q-next;/*移至下一个元素继续查找*/n+;/All cop
8、yright are preserved bycobby/*元素插入操作*/#define NULL 0/*宏定义*/typedef struct node/*定义结点类型的数据结构*/char c;/*数据域,类型为字符型*/struct node *next;/*指针域,类型为本结构体类型*/Node,*L;/*类型重定义,即Node和*L和struct node等价*/main()L l,p,q;/*用指针类型定义三个结点类型的指针*/char ch;int pos,n;l=(L)malloc(sizeof(Node);/*分配内存空间*/l-c=0;/*为头结点的数据域赋值,值为空*/
9、l-next=NULL;/*指明下一个结点目前不存在*/q=l;/*q为游动指针,链表结点的连结要用*/printf(Input a character:n);scanf(%c,&ch);getchar();while(ch!=!)/*输入!表示输入结束*/p=(L)malloc(sizeof(Node);/*为新输入的数据分配内存空间*/p-c=ch;p-next=NULL;/*新输入的结点在链表的最后,即它的后面没有其它元素*/q-next=p;/*q用于将上一个元素链接至当前新元素*/q=p;/*q自己移到当前最后一个元素,以备继续链接所用*/scanf(%c,&ch);getchar(
10、);q=l;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操作*/*以上为建立一个单链表*/printf(Input the character and its position, such as s,3nn);scanf(%c,%d,&ch,&pos);q=l;n=1;while(n!=pos&q-next!=NULL)/*未找
11、到插入位置,且后面还有元素*/q=q-next;n+;/*退出循环后,要么找到插入位置,要么表已到最后,输入的插入位置过大*/if(nc=ch;p-next=q-next;q-next=p;/*操作完成,然后输出新表*/q=l;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操作*/All copyright are preserv
12、ed bycobby/*按内容元素删除操作*/#include#include#define NULL 0/*宏定义*/typedef struct node/*定义结点类型的数据结构*/ char c;/*数据域,类型为字符型*/struct node *next;/*指针域,类型为本结构体类型*/Node,*L;/*类型重定义,即Node和*L和struct node等价*/main()L l,p,q;/*用指针类型定义三个结点类型的指针*/char ch;int n;l=(L)malloc(sizeof(Node);/*分配内存空间*/l-c=0;/*为头结点的数据域赋值,值为空*/l-
13、next=NULL;/*指明下一个结点目前不存在*/q=l;/*q为游动指针,链表结点的连结要用*/printf(Input a character:n);scanf(%c,&ch);getchar();while(ch!=!)/*输入!表示输入结束*/p=(L)malloc(sizeof(Node);/*为新输入的数据分配内存空间*/p-c=ch;p-next=NULL;/*新输入的结点在链表的最后,即它的后面没有其它元素*/q-next=p;/*q用于将上一个元素链接至当前新元素*/q=p;/*q自己移到当前最后一个元素,以备继续链接所用*/scanf(%c,&ch);getchar();
14、q=l;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操作*/*以上为建立单链表*/printf(input the character you wanna deletenn);scanf(%c,&ch);printf(the element you wanna delete is %cnn,ch);q=l-next;p=l;n=
15、1;while(q!=NULL&q-c!=ch)p=q;q=q-next;n+;/*退出循环时可能找到指定元素,也可能表读完,需要进一步判断*/if(q=NULL)printf(element not found, delete failednn);elsep-next=q-next;q=l-next;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操
16、作*/All copyright are preserved bycobby/*按位置删除元素*/#define NULL 0/*宏定义*/typedef struct node/*定义结点类型的数据结构*/char c;/*数据域,类型为字符型*/struct node *next;/*指针域,类型为本结构体类型*/Node,*L;/*类型重定义,即Node和*L和struct node等价*/main()L l,p,q;/*用指针类型定义三个结点类型的指针*/char ch;int pos,n;l=(L)malloc(sizeof(Node);/*分配内存空间*/l-c=0;/*为头结点的
17、数据域赋值,值为空*/l-next=NULL;/*指明下一个结点目前不存在*/q=l;/*q为游动指针,链表结点的连结要用*/printf(Input a character:n);scanf(%c,&ch);getchar();while(ch!=!)/*输入!表示输入结束*/p=(L)malloc(sizeof(Node);/*为新输入的数据分配内存空间*/p-c=ch;p-next=NULL;/*新输入的结点在链表的最后,即它的后面没有其它元素*/q-next=p;/*q用于将上一个元素链接至当前新元素*/q=p;/*q自己移到当前最后一个元素,以备继续链接所用*/scanf(%c,&c
18、h);getchar();q=l;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操作*/*以上为建立单链表*/printf(Input the positionn);scanf(%d,&pos);p=l;n=1;while(p-next!=NULL&n!=pos)p=p-next;n+;/*退出循环后,可能找到删除的元素位置,可能
19、表读完,需要进一步判断*/if(n=pos)/*删除位置找到,删除该位置上的元素*/p-next=p-next-next;/free(p);elseprintf(incorrect position, delete failedn);q=l;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操作*/建立双向链表#include#inc
20、lude#include#define NULL 0typedef struct dlnodechar ch;struct dlnode *pri,*next;dnode,*dl;main()dl l,p,q;char c;l=(dl)malloc(sizeof(dnode);l-ch=0;l-next=NULL;l-pri=NULL;q=l;printf(输入字符建立双向链表n);scanf(%c,&c);getchar();while(c!=!)p=(dl)malloc(sizeof(dnode);p-ch=c;p-pri=q;p-next=NULL;q-next=p;q=p;scanf(
21、%c,&c);getchar();q=l;while(q-next!=NULL)q=q-next;printf(%c-,q-ch);printf(n);while(q-pri!=NULL)printf(%c-,q-ch);q=q-pri;printf(n);/单链表就地逆置#define NULL 0/*宏定义*/typedef struct node/*定义结点类型的数据结构*/char c;/*数据域,类型为字符型*/struct node *next;/*指针域,类型为本结构体类型*/Node,*L;/*类型重定义,即Node和*L和struct node等价*/main()L l,p,
22、q,r;/*用指针类型定义三个结点类型的指针*/char ch;l=(L)malloc(sizeof(Node);/*分配内存空间*/l-c=0;/*为头结点的数据域赋值,值为空*/l-next=NULL;/*指明下一个结点目前不存在*/q=l;/*q为游动指针,链表结点的连结要用*/printf(Input a character:n);scanf(%c,&ch);getchar();while(ch!=!)/*输入!表示输入结束*/p=(L)malloc(sizeof(Node);/*为新输入的数据分配内存空间*/p-c=ch;p-next=NULL;/*新输入的结点在链表的最后,即它的后
23、面没有其它元素*/q-next=p;/*q用于将上一个元素链接至当前新元素*/q=p;/*q自己移到当前最后一个元素,以备继续链接所用*/scanf(%c,&ch);getchar();q=l;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操作*/printf(n);/以上完成了单链表的创建q=l-next;p=q-next;r=
24、p-next;q-next=NULL;while(r!=NULL)p-next=q;q=p;p=r;if(r-next!=NULL)/r后面还有结点,则逆置继续r=r-next;elsebreak;r-next=q;l-next=r;/头结点指向最后一个结点q=l;/*输入整个链表前,先将q移到链表头,l一般不动*/while(q-next!=NULL)/*若q所指向的元素后面还有其它元素,则将该元素的数据输出*/printf(%c-,q-next-c);/*q-next-c表示q所指向的下一个元素的数据*/q=q-next;/*完成该元素的输出后,q移至下一个元素重复输出操作*/printf
25、(n);/约瑟夫环问题#include#includetypedef struct lnodeint num;struct lnode *next;node,*L;main()int amount,start,circle,n,c;L p,l,q;printf(一共有几个人围成一圈?n);scanf(%d,&amount);getchar();printf(从第几个开始计数?n);scanf(%d,&start);getchar();printf(每几人一次循环?n);scanf(%d,&circle);getchar();l=(L)malloc(sizeof(node);/头结点l-next
26、=NULL;l-num=0;q=l;n=0;while(n+next=NULL;p-num=n;q-next=p;q=p;q-next=l-next;/形成循环链表/以上完成了单向循环链表的建立p=l-next;q=l;n=1;while(n+next;q=q-next;/退出循环时p,q分别位于指定位置/接下去进行周期性结点删除,直到链表只余一个结点为止n=1;/n计算被删除的结点的数量,当n=amount-1时删除结束while(n+amount)c=1;/c作为循环临时变量while(c+next;q=q-next;/删除当前p指向的结点printf(删除结点%dt,p-num);q-n
27、ext=p-next;p=p-next;printf(n最后剩下%dn,p-num);二、栈及其操作/All copyright are preserved bycobby/*建立堆栈*/#include#include#define NULL 0typedef struct nodechar ch;struct node *next;Snode,*stack;main()stack s,top,p;char ch;s=(stack)malloc(sizeof(Snode);s-ch=0;s-next=NULL;/*建立栈底指针*/top=s;scanf(%c,&ch);getchar();w
28、hile(ch!=!)p=(stack)malloc(sizeof(Snode);p-ch=ch;p-next=top;top=p;scanf(%c,&ch);getchar();while(top-next!=NULL)printf(%c-,top-ch);top=top-next;printf(n);/All copyright are preserved bycobby/*进栈与出栈*/#include#include#define NULL 0typedef struct nodechar ch;struct node *next;Snode,*stack;main()stack s,
29、top,p;char ch;int choice;s=(stack)malloc(sizeof(Snode);s-ch=!;s-next=NULL;/*建立栈底指针*/top=s;scanf(%c,&ch);getchar();while(ch!=!)p=(stack)malloc(sizeof(Snode);p-ch=ch;p-next=top;top=p;scanf(%c,&ch);getchar();while(p-next!=NULL)/此处p可用top代替printf(%c-,p-ch);p=p-next;printf(n);/*以上建立了一个堆栈*/printf(进栈或出栈?输入“1”为进栈,输入“2”为出栈,其它则退出程序n);scanf(%d,&choice);getchar();while(choice=1|choice=2)/若不是输入1或2,则不做任何操作if(choice=1)/*进栈*/printf(n输入要入栈的元素n);scanf(%c,&ch);getchar();p=(stack)malloc(sizeof(Snode);p-ch=ch;p-next=top;top=p;else if