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;}
}

源文件

/*编写函数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=NULLif(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);elseprintf("Not Found!\n");delList(head);return 0;
}

【C语言】数据结构C语言版 实验3 带头结点的单链表相关推荐

  1. 链表分解单双数c语言代码,编写一程序,将带头结点的单链表拆成一个奇数链表和一个偶数链表...

    我写了一个,你参考参考! #include #include typedef  struct  node { int data; struct node  *next; }linknode; type ...

  2. C语言实现不带头结点的单链表逆置的三种方法

    C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...

  3. 2.3 带头结点的单链表:理论+编程实战(C语言详细)

    1.顺序存储:线性表/栈/队列:理论+C语言实现–详细 2.1 链式存储概述 和 2.2 线性表的链式存储–单链表(C语言详细实现) 文章目录 2.3 带头结点的单链表 1. 带头结点的单链表基本概念 ...

  4. C语言不带头结点的单链表

    C语言不带头结点的单链表 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>typedef st ...

  5. 不带头结点的单链表------C语言实现

    1 /****************************************************/ 3 File name:no_head_link.c4 Author:SimonKly ...

  6. 数据结构练习:运用单链表实现图书管理系统(c/c++)(内含带头结点的单链表的基本操作)

    数据结构练习:运用单链表实现图书管理系统 正文 注意 部分功能运行展示 所包含头文件及结构体的定义 自定义函数 主函数 完整代码 结束语 正文 本程序使用带头节点的单链表存储结构实现,共有六个基本功能 ...

  7. 不带头结点的单链表------C语言实现(带注释)

    #include <stdio.h> #include <stdlib.h> /*next 英文词的意思 是 "下一个". 链表里 用于 指向下一个节点的指 ...

  8. 【数据结构】带头结点的单链表

    文章目录 一.单链表的概念 二.结构体声明: 三.函数 1.购买节点 2.释放节点 3.单链表的初始化 4.判空函数 5.获取单链表有效值个数 6.按数据查询(返回含有此数据节点的前驱) 7.按数据查 ...

  9. 【C语言】数据结构C语言版 实验2 不带头结点的单链表

    运行环境:Dev-C++ vs2013可能不能运行 首先新建一个头文件slnklist.h #include <stdio.h> #include <stdlib.h> /** ...

最新文章

  1. 小米MIX 3如何刷成开发版启用Root超级权限
  2. 阿里云 centos 远程可视化桌面部署
  3. ROStopic 通信方式
  4. 计算机成绩表用函数怎么做,题用Excel函数以计算机成绩为依据计算出等次,怎么用函数IF 设定三个分类,如》90 为优秀 79~89为良好其余合格...
  5. uni-app中使用腾讯位置服务实现小程序地图选点功能
  6. notepad怎么运行php程序,notepad怎么运行php程序
  7. Linux虚拟机添加磁盘
  8. Voxengo Peakbuster for mac(音频谐波增强插件)
  9. (十五)洞悉linux下的Netfilteriptables:开发自己的hook函数【实战】
  10. linux+脚本+pid,Linux启动脚本输出pid
  11. Turbo码编码举例计算
  12. 中国石油大学(北京)-《 修井工程》第二阶段在线作业
  13. 一口气说出 OAuth2.0 的四种授权方式,面试官会高看一眼
  14. c语言 求单元格中间某段字符串,EXCEL怎么取单元格里面的的值的中间某些字符...
  15. python中得到26个字母
  16. 在2018年使用xp是怎样的体验
  17. 网络打印机计算机服务,如何把局域网中的所有计算机及打印机设置共享?
  18. 仿朋友圈图片查看功能
  19. 史上最污技术解读,老司机瞬间开车!
  20. 大姨妈VS美柚:她经济的归宿是AI医疗还是社区电商

热门文章

  1. Pandas: 使用read_excel、describe、loc方法求极差、变异系数与四分位数间距
  2. Linux——Linux下安装tree
  3. Kubernetes-PersistentVolume(PV)介绍(八)
  4. python-对向-查看全部属性-查看全部方法
  5. linux-使用xshell连接linux教程
  6. bootstrap-干货小结
  7. jquery-ajax-jsonp-360搜索引擎的联想词获取
  8. python-环境安装-pycharm安装-新手入门可使用社区版
  9. metronic 4.5.7开发环境下, 在Windows 10上安装了10.16.0版本的node js之后,导致node sass无法加载...
  10. https://www.cnblogs.com/jingmoxukong/p/7755643.html