编写函数linklist delx(linklist head, datatype 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 *linklist;
linklist creatbyqueue()
{
linklist head, r, s;
datatype x;
head = r = NULL;
printf("请输入若干整数序列:");
scanf("%d", &x);
while(x!=0)
{
s = (linklist)malloc(sizeof(node));//产生新节点
s->info = x;//设置新结点值为x
if(head==NULL)//该表为空表
head = s;//新节点插入空表
else
r->next = s;//把值为x的结点插入到表尾
r = s;//r指向新的尾节点
scanf("%d", &x);
}
if(r)
r->next = NULL;//对于非空表,最后结点的next域置空
return head;
}
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");
}
}
void delList(linklist head)
{
linklist p = head;
while(p)
{
head = p->next;
free(p);
p = head;
}
}
linklist delx(linklist head,datatype x)
{
linklist p = head;
if(head->info==x) {//当被删除的结点是单链表中的第一个结点
head = head ->next;
}
else {
linklist pre = head;//p的前驱结点指向头结点
p = head ->next;//p指向头结点的下一个结点
while(p) {//没有找完
if(p->info!=x) {//没有找到
pre = p;//pre指向p的前驱结点
p = p->next;//p指向下一个结点
}
else {
pre->next = p->next;//删除p指向的结点,把前驱结点pre变为删除结点p的后继结点
break;
}
}
}
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); /*释放单链表空间*/
system("pause");
return 0;
}
编写算法函数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* linklist;
linklist creatbyqueue()
{
linklist head, r, s;
datatype x;
head = r = NULL;
printf("请输入若干整数序列:");
scanf("%d", &x);
while(x!=0)
{
s = (linklist)malloc(sizeof(node));
s->info = x;//设置新结点
if(head==NULL)
head = s;
else
r->next = s;//把值为x的结点插入到表尾
r = s;//r指向新的尾节点
scanf("%d", &x);
}
if(r)
r->next = NULL;//对于非空表,最后结点的next域置空
return head;
}
void print(linklist head)
{
linklist p;
p = head;
int i = 0;
printf("List is:\n");
while (p) {
printf("%5d", p->info);
p = p->next;
i++;
if (i % 10 == 0) printf("\n");
}
printf("\n");
}
void delList(linklist head)
{
linklist p = head;
while (p) {
p = p->next;
free(p);
}
}
linklist delallx(linklist head,int x)
{
int flag = 1;
while((head->info)==x&&head!=NULL) {//表不为空 且 头结点值为x
head = head->next;
if(head==NULL) {//表中所有结点值为x的情况
flag = 0;
break;}}
if(flag==1) {
linklist pre = head;//pre指向head的前驱结点
linklist p = head->next;//p指向head的后继结点
while(p) {
if(p->info==x) {//单链表中除头结点外其他元素值为x
pre ->next = p->next;//删除p指向的结点,把前驱结点pre变为删除结点p的后继结点
p = p->next;//p指向下一个结点
}
else {
pre = p;//没有找到值为x的结点,p的前驱结点指向p
p = p->next;
}
}
}
return head;
}
int main()
{
datatype x;
linklist head;
head = creatbyqueue();
print(head);
printf("请输入要删除的值:");
scanf_s("%d", &x);
head = delallx(head, x);
print(head);
delList(head);
return 0;
}