1、编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。
并构造测试用例进行测试。
2、假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,
请设计算法函数linklist reverse1(linklist head)和
void reverse2(linklist *head)将不带头结点的单链表head就地倒置,
使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
3、假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
4、编写算法函数linklist delallx(linklist head, int x),删除不带头结点单链表head中所有值为x的结点。
不带头结点的链表结构定义及头插法建表,尾插法建表和打印链表等函数定义
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct link_node
{
datatype info;
struct link_node *next;
}node;
typedef node *link_list;
link_list creatbystack()/*头插法建立一个单链表*/
{
link_list head, s;
datatype x;
head = NULL;
printf("请输入若干整数序列:\n");
scanf_s("%d", &x);
while (x != 0)/*以0结束输入*/
{
s = (link_list)malloc(sizeof(node));
s->info = x;
s->next = head;/*/将新结点插入到单链表最前面*/
head = s;
scanf_s("%d", &x);
}
return head;/*返回建立的新链表*/
}
link_list creatbyqueue()/*尾插法建立单链表*/
{
link_list head, s, r;
datatype x;
head = r = NULL;
printf("请输入若干整数序列");
scanf_s("%d", &x);
while (x != 0)/*以0结束输入*/
{
s = (link_list)malloc(sizeof(node));
s->info = x;
if (head == NULL) /*将新结点插入到链表最后面*/
head = s;
else
r->next = s;
r = s;
scanf_s("%d", &x);
}
if (r)
r->next = NULL;
return head;
}
void print(link_list head)
{
link_list 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");
}
void delList(link_list head)/*释放不带头结点的单链表*/
{
link_list p = head;
while (p)
{
head = p->next;
free(p);
p = head;
}
}
一,
void delList(link_list head)/*释放不带头结点的单链表*/
{
link_list p = head;
while (p)
{
head = p->next;
free(p);
p = head;
}
}
link_list delx(link_list head, datatype x)/*删除不带头结点单链表head中的第一个值为x的值*/
{
link_list p = head, q, 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()
{
link_list head;
datatype x;
head = creatbyqueue();
print(head);
printf("请输入你要删除的数:");
scanf_s("%d", &x);
head = delx(head, x);
print(head);
delList(head);
system("pause");
return 0;
}
二,
link_list reverse1(link_list head)
{
link_list p = head, q, pre = NULL;
while (p != NULL)
{
q = p;
p = p->next;
q->next = pre;
pre = q;
}
return pre;
}
void reverse2(link_list *head)
{
link_list p = *head, pre = NULL;
while (p != NULL)
{
*head = p->next;
p->next = pre;
pre = p;
p = *head;
}
*head = pre;
}
int main()
{
link_list head;
datatype x;
head = creatbystack();/*头插法单链表*/
print(head);/*输出原单链表*/
head = reverse1(head);/*倒置单链表*/
print(head);/*输出倒置后的单链表*/
reverse2(&head);/*倒置单链表*/
print(head);
delList(head);
system("pause");
return 0;
}
三,
link_list insert(link_list head, datatype x)
{
link_list pre = NULL, p = head, h;
h = (link_list)malloc(sizeof(node));
h->info = x;
while (p&&p->info < x)
{
pre = p;
p = p->next;
}
if (pre == NULL)
{
h->next = head;
head = h;
}
else if (pre != NULL)
{
h->next = p->next;
p->next = h;
}
else
{
pre->next = h;
h->next = NULL;
}
return head;
}
int main()
{
datatype x;
link_list head;
printf("输入一组升序排列的整数:\n");
head = creatbyqueue(); /*尾插入法建立单链表*/
print(head);
printf("请输入要插入的值:");
scanf_s("%d", &x);
head = insert(head, x); /*将输入的值插入到单链表适当位置*/
print(head);
delList(head);
system("pause");
return 0;
四,
link_list delallx(link_list head, datatype x)
{
link_list p = head, pre = NULL;
do
{
while (p&&p->info != x)
{
pre = p;
p = p->next;
}
if (p)
{
if (!pre)
head = head->next,pre = NULL;
else
pre->next = p->next;
}
p = p->next;
} while (p);
return head;
}
int main()
{
datatype x;
link_list head;
head = creatbyqueue(); /*尾插入法建立单链表*/
print(head);
printf("请输入要删除的值:");
scanf_s("%d", &x);
head = delallx(head, x);
print(head);
delList(head);
system("pause");
return 0;
}