您的位置:首页 > 其它

进阶项目13- 改造链表

2016-08-16 23:08 218 查看
任务和代码:(1)编写make_list2()函数建立链表,使建立链表时,后输入的数据,将新输入的数字对应的结点放在链表末尾。若输入为3 5 2 9 4 7 0,建立的链表为:

(2)编写函数void search(int x),输出链表中是否有值为x的结点。

(3)编写函数delete_first_node(),删除链表中的第一个结点。

(4)编写函数delete_node(int x),删除结点值为x的结点。

(5)编写make_list3()函数建立链表,使建立链表时,使结点中的数据呈现升序。若输入为3 5 2 9 4 7 0,建立的链表为:

(6)编写函数void insert(int x),将值为x的结点插入到由make_list3建立起来的有序链表中。

/*
文件名:main.c
作者:小风景
完成日期:2016.8.16
问题描述:(1)编写make_list2()函数建立链表,使建立链表时,后输入的数据,将新输入的数字对应的结点放在链表末尾。若输入为3 5 2 9 4 7 0,建立的链表为:

(2)编写函数void search(int x),输出链表中是否有值为x的结点。
(3)编写函数delete_first_node(),删除链表中的第一个结点。
(4)编写函数delete_node(int x),删除结点值为x的结点。
(5)编写make_list3()函数建立链表,使建立链表时,使结点中的数据呈现升序。若输入为3 5 2 9 4 7 0,建立的链表为:

(6)编写函数void insert(int x),将值为x的结点插入到由make_list3建立起来的有序链表中。
程序输出:
*/

#include <iostream>
using namespace std;
#include <stdio.h>
#include <malloc.h>
#define N 5

typedef struct NODE
{
int data; //结点的数据
struct NODE *next; //指向下一结点
} Node;

Node *head=NULL; //将链表头定义为全局变量,以便于后面操作
void make_list(); //建立链表
void out_list(); //输出链表
void make_list2(); //按照输入顺序创建链表
void search(int x);
void delete_first_node();
void delete_node(int x);
void make_list3();
void insert(int x);

int main( )
{
int searchnum = 0;
int deletenum = 0;
int insertnum = 0;

make_list();
out_list();
make_list2();
printf("请输入要查找的数:\n");
fflush(stdin);
scanf("%d",&searchnum);
search(searchnum);
delete_first_node();
printf("请输入要删除的数:\n");
fflush(stdin);
scanf("%d",&deletenum);
delete_node(deletenum);
make_list3();
printf("请输入要插入的数:\n");
fflush(stdin);
scanf("%d",&insertnum);
insert(insertnum);

return 0;
}

//创建一个逆序的链表
void make_list()
{
int n;
Node *p;
printf("输入若干正数(以0或一个负数结束)建立链表:\n" );
scanf("%d", &n);
while(n>0) //输入若干正数建立链表,输入非正数时,建立过程结束
{
p=(Node*)malloc(sizeof(Node)); //新建结点
p->data=n;
p->next=head; //新建的结点指向原先的链表头
head=p; //链表头赋值为新建的节点,这样,新结点总是链表头
scanf("%d", &n); //输入下一个数,准备建立下一个结点
}
return;
}

//输出链表中的元素
void out_list()
{
Node *p=head;
printf("链表中的数据为:\n");
while(p!=NULL)
{
printf("%d ", p->data);
p=p->next;
}
printf("\n");
return;
}

//创建一个按顺序输入的链表
void make_list2()
{
int n = 0;
head = NULL;
Node *p = NULL;
Node *last = NULL;

fflush(stdin);
printf("输入若干正数(以0或一个负数结束)建立链表:\n" );
scanf("%d",&n);
while(n > 0)
{
p = (Node *)malloc(sizeof(Node));
p->data = n;
p->next = NULL;
if(head == NULL)
{
head = p;
}
else
{
last->next = p;
}
last = p;
scanf("%d",&n);
}

out_list();
return;
}

//查找链表中是否存在某个值
void search(int x)
{
Node *p = head;

while(p != NULL)
{
if(x == p->data)
{
printf("在链表中找到了%d\n",x);
break;
}
p = p->next;
}

if(NULL == p)
{
printf("链表中不存在元素%d\n",x);
}

return;
}

//删除链表的首节点
void delete_first_node()
{
Node *p = head;

head = p->next;
free(p);
printf("链表删除首节点后");
out_list();

return;
}

//删除链表的某个节点
void delete_node(int x)
{
Node *p = head;
Node *q = NULL;

if(NULL == head)
{
printf("List is null, delete fail.\n");
}
else
{
while((x != p->data) && (p != NULL))
{
q = p;
p = p->next;
}
if(x == p->data)
{
if(p == head)
{
head = p->next;
}
else
{
q->next = p->next;
}
free(p);
}
else
{
printf("%d not found, delete fail.\n", x);
}
}

out_list();
return;
}

//创建升序链表
void make_list3()
{
head = NULL;
Node *q1 = NULL;
Node *q2 = NULL;
Node *p = NULL;
int number = 0;

printf("构建升序链表,请输入数据元素:\n");
fflush(stdin);
scanf("%d",&number);
while(number > 0)
{
q1 = head;
p = (Node *)malloc(sizeof(Node));
p->data = number;
if(NULL == head)
{
head = p;
p->next = NULL;
}
else if(p->data < head->data)
{
head = p;
p->next = q1;
}
else
{
while((NULL != q1) && (p->data >= q1->data))
{
q2 = q1;
q1 = q1->next;
}
p->next = q2->next;
q2->next = p;
}

scanf("%d",&number);
}

out_list();
return;
}

//将某个值插入升序链表中
void insert(int x)
{
Node *q1 = head;
Node *q2 = NULL;
Node *p = (Node *)malloc(sizeof(Node));

p->data = x;
if(NULL == head)
{
head = p;
p->next = NULL;
}
else if(p->data < head->data)
{
head = p;
p->next = q1;
}
else
{
while((NULL != q1) && (p->data >= q1->data))
{
q2 = q1;
q1 = q1->next;
}
p->next = q2->next;
q2->next = p;
}

out_list();
return;
}


程序运行结果:





总结:这个程序中有部分的代码重复了,可以简化,如在链表中插入数据和建立有序的链表,有序链表可以看做n次向链表中插入数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: