数据结构 不带头结点的单链表 删除

编写函数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;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值