lab2_01.c
lab2_02.c
lab2_03.c
lab2_04.c
slnklist.h
- /*编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。
- 并构造测试用例进行测试。
- */
- /**********************************/
- /*文件名称:lab2_01.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist delx(linklist head,datatype x)
- {
- linklist p = head,pre=NULL;//一定要初始化pre=NULL
- while(p&&p->info!=x)
- {
- pre = p;
- p = p->next;
- }
- if(p)
- {
- if(!pre)
- {
- head = head->next;
- }
- else
- {
- 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;
- }
lab2_02.c
- /**********************************/
- /*文件名称:lab2_02.c */
- /**********************************/
- /*
- 假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,
- 请设计算法函数linklist reverse1(linklist head)和
- void reverse2(linklist *head)将不带头结点的单链表head就地倒置,
- 使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
- */
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist reverse1(linklist head)
- {
- linklist p,q;
- p=head;
- head = NULL;
- while(p) //核心
- {
- q = p->next;
- p->next = head;
- head=p;
- p=q;
- }
- return head;
- }
- void reverse2(linklist *head) //不返回值,那就从指针上下手
- {
- linklist p,q;
- p=*head;
- *head = NULL;
- while(p)
- {
- q = p->next;
- p->next = *head;
- *head=p;
- p=q;
- }
- }
- int main()
- { datatype x;
- linklist head;
- head=creatbystack(); /*头插入法建立单链表*/
- print(head); /*输出原链表*/
- head= reverse1(head); /*倒置单链表*/
- print(head); /*输出倒置后的链表*/
- reverse2(&head); /*倒置单链表*/
- print(head);
- delList(head);
- return 0;
- }
lab2_03.c
- /*
- 假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
- 将值为x的结点插入到链表head中,并保持链表有序性。
- 分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
- */
- /**********************************/
- /*文件名称:lab2_03.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist insert(linklist head ,datatype x)
- {
- linklist pre,p,s;
- s = (linklist)malloc(sizeof(node));
- s->info = x;
- p = head;
- pre=NULL;
- while(p&&p->infonext;
- }
- if(!pre) //插在表头
- {
- s->next = head;
- head = s;
- }else{ //插在中间或者末尾
- 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;
- }
lab2_04.c
- /*
- 编写算法函数linklist delallx(linklist head, int x),删除不带头结点单链表head中所有值为x的结点。
- */
- /**********************************/
- /*文件名称:lab2_04.c */
- /**********************************/
- #include "slnklist.h"
- /*请将本函数补充完整,并进行测试*/
- linklist delallx(linklist head,int x)
- {
- linklist p,t;
- while(head)//如果要删除的是第一个
- {
- if(head->info==x)
- {
- p=head;
- head=head->next;
- free(p);//回收p
- } else {
- break;
- }
- }
- if(head)//如果删除的不是第一个
- {
- p=head;
- 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;
- }
slnklist.h
- #include <stdio.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=NULL;
- printf("请输入若干整数序列:\n");
- scanf("%d",&x);
- while (x!=0) /*以0结束输入*/
- { s=(linklist)malloc(sizeof(node)); /*生成待插入结点*/
- s->info=x;
- s->next=head; /*将新结点插入到链表最前面*/
- head=s;
- scanf("%d",&x);
- }
- return head; /*返回建立的单链表*/
- }
- /**********************************/
- /*函数名称:creatbyqueue() */
- /*函数功能:尾插法建立单链表 */
- /**********************************/
- linklist creatbyqueue()
- {
- linklist head,r,s;
- datatype x;
- head=r=NULL;
- printf("请输入若干整数序列:\n");
- scanf("%d",&x);
- while (x!=0) /*以0结束输入*/
- { s=(linklist)malloc(sizeof(node));
- s->info=x;
- if (head==NULL) /*将新结点插入到链表最后面*/
- head=s;
- else
- r->next=s;
- r=s;
- scanf("%d",&x);
- }
- if (r) r->next=NULL;
- return head; /*返回建立的单链表*/
- }
- /**********************************/
- /*函数名称:print() */
- /*函数功能:输出不带头结点的单链表 */
- /**********************************/
- void print(linklist head)
- { linklist p;
- int i=0;
- p=head;
- printf("List is:\n");
- while(p)
- {
- printf("%5d",p->info);
- p=p->next;
- i++;
- if (i%10==0) printf("\n");
- }
- printf("\n");
- }
- /**********************************/
- /*函数名称:delList() */
- /*函数功能:释放不带头结点的单链表 */
- /**********************************/
- void delList(linklist head)
- { linklist p=head;
- while (p)
- { head=p->next;
- free(p);
- p=head;
- }
- }
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏