- /*编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。
- 并构造测试用例进行测试。
- */
- /**********************************/
- /*文件名称:lab3_01.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist delx(linklist head,datatype x)
- {
- linklist p,pre=head; //别忘了pre=head
- p = head->next;
- while(p->info!=x)
- {
- pre = p;
- p = p->next;
- }
- if(p)
- {
- pre->next = p->next;
- free(p);
- }
- return head;
- }
- int main()
- { datatype x;
- linklist head;
- head=creatbyqueue(); /*尾插入法建立带头结点的单链表*/
- print(head);
- printf("请输入要删除的值:");
- scanf("%d",&x);
- head=delx(head,x); /*删除单链表的第一个值为x的结点*/
- print(head);
- delList(head); /*释放单链表空间*/
- return 0;
- }
- /**********************************/
- /*文件名称:lab3_02.c */
- /**********************************/
- /*
- 假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数linklist reverse(linklist head),
- 将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
- */
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist reverse(linklist head)
- {
- //不带头节点是head,带头节点是head->next
- linklist p,q;
- p = head->next;
- head->next = NULL;
- while(p)
- {
- q = p->next;
- p->next = head->next;
- head->next = p;
- p = q;
- }
- return head;
- }
- int main()
- { datatype x;
- linklist head;
- head=creatbystack(); /*头插入法建立带头结点的单链表*/
- print(head); /*输出原链表*/
- head= reverse(head); /*倒置单链表*/
- print(head); /*输出倒置后的链表*/
- delList(head);
- return 0;
- }
- /*
- 假设带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
- 将值为x的结点插入到链表head中,并保持链表有序性。
- 分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
- */
- /**********************************/
- /*文件名称:lab3_03.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist insert(linklist head ,datatype x)
- {
- //要插入的数据s,位于pre和 p之间
- linklist pre,p,s;
- s = (linklist)malloc(sizeof(node));
- s->info = x;
- p = head->next;
- pre = head;
- while(p&&p->info<x)
- {
- pre = p;
- p = p->next;
- }
- pre->next = s;
- s->next = p;
- return head;
- }
- int main()
- { datatype x;
- linklist head;
- printf("输入一组升序排列的整数:\n");
- head=creatbyqueue(); /*尾插入法建立带头结点的单链表*/
- print(head);
- printf("请输入要插入的值:");
- scanf("%d",&x);
- head=insert(head,x); /*将输入的值插入到带头结点的单链表适当位置*/
- print(head);
- delList(head);
- return 0;
- }
- /*
- 编写算法函数linklist delallx(linklist head, int x),删除带头结点单链表head中所有值为x的结点。
- */
- /**********************************/
- /*文件名称:lab3_04.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist delallx(linklist head,int x)
- {
- //不带头节点是head,带头节点是head->next
- linklist p,t;
- while(head->next)//如果要删除的是第一个
- {
- if(head->next->info==x)//如果第一个数=x
- {
- p=head->next;//删除操作
- head->next=head->next->next;
- free(p);//回收p
- } else {
- break;
- }
- }
- if(head->next)//如果删除的不是第一个
- {
- p=head->next;
- while(p->next)
- {
- if(p->next->info==x)
- {
- t=p->next;
- p->next=p->next->next;
- free(t);
- } else {
- p=p->next;
- }
- }
- }
- return head;
- }
- int main()
- { datatype x;
- linklist head;
- head=creatbyqueue(); /*尾插入法建立带头结点的单链表*/
- print(head);
- printf("请输入要删除的值:");
- scanf("%d",&x);
- head=delallx(head,x);
- print(head);
- delList(head);
- return 0;
- }
- /*
- 已知线性表存储在带头结点的单链表head中,请设计算法函数void sort(linklist head),将head中的结点按结点值升序排列。
- */
- /**********************************/
- /*文件名称:lab3_05.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- void sort(linklist head)
- {
- int temp; //temp是int类型,notice
- linklist p,pre;
- pre=p=head->next;
- while(pre) //pre是前面那个数,p是后面那个数
- {
- p=pre;//notice,p是从pre后面数里走
- while(p)
- {
- if(pre->info>p->info) //交换
- {
- temp=p->info;
- p->info=pre->info;
- pre->info=temp;
- }
- p=p->next;
- }
- pre=pre->next;
- }
- return head;
- }
- int main()
- { linklist head;
- head=creatbyqueue(); /*尾插法建立带头结点的单链表*/
- print(head); /*输出单链表head*/
- sort(head); /*排序*/
- print(head);
- delList(head);
- return 0;
- }
- /*
- 已知两个带头结点的单链表L1和L2中的结点值均已按升序排序,设计算法函数
- linklist mergeAscend (linklist L1,linklist L2)将L1和L2合并成一个升序的
- 带头结单链表作为函数的返回结果;
- 设计算法函数linklist mergeDescend (linklist L1,linklist L2)
- 将L1和L2合并成一个降序的带头结单链表作为函数的返回结果;
- 并设计main()函数进行测试。
- */
- /**********************************/
- /*文件名称:lab3_06.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist mergeAscend(linklist L1,linklist L2)//升序
- {
- linklist head,x,y,p;
- head=(linklist)malloc(sizeof(node));
- head->next=NULL;
- p=head;
- x=L1->next;
- y=L2->next;
- while(x&&y)
- {
- //当比到最好一个元素的时候,会出现x->next=NULL或者是y->next=NULL
- if(x->info<=y->info)//L1里的数<L2的数
- {
- //这两句是尾插法的核心
- p->next=x; //把新元素插到当前元素后面去
- p=x; //吧当前指针指向新元素
- x=x->next;
- }
- else
- {
- //这两句是尾插法的核心
- p->next=y; //把新元素插到当前元素后面去
- p=y; //吧当前指针指向新元素
- y=y->next;
- }
- }
- p->next=x?x:y; //把最后一个数加进去
- return head;
- }
- linklist mergeDescend(linklist L1,linklist L2)//降序
- {
- }
- int main()
- { linklist h1,h2,h3;
- h1=creatbyqueue(); /*尾插法建立单链表,请输入升序序列*/
- h2=creatbyqueue();
- print(h1);
- print(h2);
- //升序合并请调用
- h3=mergeAscend(h1,h2);
- //降序合并请调用
- // h3=mergeDescend(h1,h2);
- print(h3);
- delList(h3);
- return 0;
- }
- /*
- /*
- 设计一个算法linklist interSection(linklist L1,linklist L2),
- 求两个单链表表示的集合L1和L2的交集,并将结果用一个新的带头
- 结点的单链表保存并返回表头地址。
- */
- /**********************************/
- /*文件名称:lab3_07.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist interSection(linklist L1, linklist L2)
- {
- linklist head,p,s,x,y; //s是临时存储的结点
- head=(linklist)malloc(sizeof(node));
- head->next=NULL;
- p = head;
- x = L1->next;
- y = L2->next;
- while(x)
- {
- while(y)
- {
- if(x->info==y->info)
- {
- s = (linklist)malloc(sizeof(node));
- s->info = x->info;
- p->next = s; //这两句不能互换,因为是添加数据
- p = s;
- break; //notice,不可省略 ,跳出本层循环 ,不执行y=y->next
- }
- y = y->next;
- }
- x = x->next;
- }
- p->next = NULL;
- return head;
- }
- int main()
- {
- linklist h1,h2,h3;
- h1=creatbyqueue(); /*尾插法建立单链表,输入时请勿输入重复数据*/
- h2=creatbyqueue();
- print(h1); /*输出单链表h1*/
- print(h2);
- h3=interSection(h1,h2); /* 求h1和h2的交集*/
- print(h3);
- delList(h1);
- delList(h2);
- delList(h3);
- return 0;
- }
- /*
- 请编写一个算法函数void partion(linklist head),
- 将带头结点的单链表head中的所有值为奇数的结点调整
- 到链表的前面,所有值为偶数的结点调整到链表的后面。
- */
- /**********************************/
- /*文件名称:lab3_08.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- void partion(linklist head)
- {
- linklist p,s,pre;
- pre=head;
- p=head->next;
- while(p)
- {
- if(p->info%2==0) //偶数
- {
- pre=p;
- p=p->next;
- }
- else
- {
- s=p;
- pre->next=p->next;
- p=pre->next;
- s->next=NULL;
- s->next=head->next;
- head->next=s;
- }
- }
- }
- int main()
- { linklist head;
- head=creatbyqueue(); /*尾插法建立带头结点的单链表*/
- print(head); /*输出单链表head*/
- partion(head);
- print(head);
- delList(head);
- return 0;
- }
- /*
- 编写一个程序,用尽可能快的方法返回带头结点单链表中倒数第k个结点的地址,如果不存在,则返回NULL。
- */
- /**********************************/
- /*文件名称:lab3_09.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist search(linklist head,int k)
- {
- linklist p = head->next,x;
- int count = 0,i;
- x = p;
- while(x) //求链表长度
- {
- count++;
- x=x->next;
- } //获得倒数第k的值
- for(i=0;i<count-k;i++)
- {
- p = p->next;
- }
- return p;
- }
- int main()
- {
- int k;
- linklist head,p;
- head=creatbyqueue(); /*尾插法建立带头结点的单链表*/
- print(head); /*输出单链表head*/
- printf("k=");
- scanf("%d",&k);
- p=search(head,k);
- if (p) printf("%d\n",p->info);
- else
- printf("Not Found!\n");
- delList(head);
- return 0;
- }
slnklist.h
- #include <stdio.h>
- #include <stdlib.h>
- /**************************************/
- /* 链表实现的头文件,文件名slnklist.h */
- /**************************************/
- typedef int datatype;
- typedef struct link_node{
- datatype info;
- struct link_node *next;
- }node;
- typedef node *linklist;
- /******************************************/
- /*函数名称:creatbystack() */
- /*函数功能:头插法建立带头结点的单链表 */
- /******************************************/
- linklist creatbystack()
- {
- linklist head,s;
- datatype x;
- head=(linklist)malloc(sizeof(node));
- head->next=NULL;
- printf("请输入整数序列(空格分开,以0结束):\n");
- scanf("%d",&x);
- while (x!=0)
- {
- s=(linklist)malloc(sizeof(node));
- s->info=x;
- s->next=head->next;
- head->next=s;
- scanf("%d",&x);
- }
- return head;
- }
- /***************************************/
- /*函数名称:creatbyqueue() */
- /*函数功能:尾插法建立带头结点的单链表 */
- /***************************************/
- linklist creatbyqueue()
- {
- linklist head,r,s;
- datatype x;
- head=r=(linklist)malloc(sizeof(node));
- head->next=NULL;
- printf("请输入整数序列(空格分开,以0结束):\n");
- scanf("%d",&x);
- while (x!=0)
- {
- s=(linklist)malloc(sizeof(node));
- s->info=x;
- r->next=s; //把新元素放到当前元素后面
- r=s; //把当前指针指向新元素
- scanf("%d",&x);
- }
- r->next=NULL;
- return head;
- }
- /**********************************/
- /*函数名称:print() */
- /*函数功能:输出带头结点的单链表 */
- /**********************************/
- void print(linklist head)
- {
- linklist p;
- int i=0;
- p=head->next;
- printf("List is:\n");
- while(p)
- {
- printf("%7d",p->info);
- i++;
- if (i%10==0) printf("\n");
- p=p->next;
- }
- printf("\n");
- }
- /******************************************/
- /*函数名称:creatLink() */
- /*函数功能:从文件中读入n个数据构成单链表 */
- /******************************************/
- linklist creatLink(char *f, int n)
- {
- FILE *fp;
- int i;
- linklist s,head,r;
- head=r=(linklist)malloc(sizeof(node));
- head->next=NULL;
- fp=fopen(f,"r");
- if (fp==NULL)
- return head;
- else
- {
- for (i=0;i<n;i++)
- {
- s=(linklist)malloc(sizeof(node));
- fscanf(fp,"%d",&(s->info));
- r->next=s;
- r=s;
- }
- r->next=NULL;
- fclose(fp);
- return head;
- }
- }
- /*
- 函数名称:writetofile
- 函数功能:将链表内容存入文件f
- */
- void writetofile(linklist head, char *f)
- {
- FILE *fp;
- linklist p;
- int i=0;
- fp=fopen(f,"w");
- if (fp!=NULL)
- {
- p=head->next;
- fprintf(fp,"%s","List is:\n");
- while(p)
- {
- fprintf(fp,"%7d",p->info);
- i++;
- if (i%10==0) fprintf(fp,"%c",'\n');
- p=p->next;
- }
- fprintf(fp,"%c",'\n');
- fclose(fp);
- }
- else printf("创建文件失败!");
- }
- /**********************************/
- /*函数名称:delList() */
- /*函数功能:释放带头结点的单链表 */
- /**********************************/
- void delList(linklist head)
- { linklist p=head;
- while (p)
- { head=p->next;
- free(p);
- p=head;
- }
- }
本文地址:http://liuyanzhao.com/3596.html
转载请注明
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏