c语言-单链表的增删改查(简单版)

在学了链表之后,自己也能写出一个简单的链表结构,这里就将自己的代码分享一下。如果发现有不足之处,欢迎指出。

1.创建结构体

typedef struct dnode
{
	int data;
	struct dnode *next;
}snode,*ptr;

2.实现向后插入法构造链表函数

这里返回的是head,

ptr initlink()//初始化链表并插入元素(向后插入)
{
	ptr head,last,p;
	int x,i,n;
    head=last=(ptr)malloc(sizeof(snode));
    last->next=NULL;
	printf("请输入要输入几个数:");
    scanf("%d",&n);//读入第一个元素
    for(i=0;i<n;i++)//当读的不是结束标记继续循环
    {
		printf("请输入第%d个想加入的数字:",i+1);
		scanf("%d",&x);//读入元素
        p=(ptr)malloc(sizeof(snode));//申请一个存储节点
    	p->data=x;//置结点的值域
    	last->next=p;
    	p->next=NULL;
    	last=p;
    }
    p=head;head=head->next;free(p);//删除辅助结点
    return(head);//返回表头指针
}

3.实现按顺序显示链表函数

void showlink(ptr p){//显示链表所有元素
	printf("您现在的链表为:");
	while(p!=NULL){
		printf("%d  ",p->data);
		p=p->next;
	}
	printf("\n");
}

4.实现按值查找函数

判断放在了主函数,如果返回值是0,说明该值不存在,如果返回不是0,则该返回值就是该值所在链表的位置(并不是下标位置,而是下标位置+1)

int findlink(ptr p,int x)
{
	int i=0;
	while(p!=NULL)
	{
		i=i+1;
		if(p->data==x) return i;
		p=p->next;
	}
	return 0;
}

5.实现按值删除链表函数

因为只设置了一个结点,因此这里查找的点是需要删除点的前一个结点,这样方便结点的移动。

ptr deletelink(ptr p,int x)
{
	ptr head;
	head = p;
	if(head->data==x){//查看头结点是否是要删除的值
		head=head->next;
		return head;
	}
	while(p->next!=NULL){
		if(p->next->data==x)//判断结点p的下一个结点的值是否是需要删除的值
		{
			p->next=p->next->next;
			return head;
		}
		p=p->next;
	}
	printf("对不起您要删除的值不存在\n");
	return head;
}

6.实现按位插入值函数

ptr insertlink(ptr p,int x,int val)
{
	ptr head,q;
	int i=1;
	head=p;
	q=(ptr)malloc(sizeof(snode));//创建新结点,方便用来将结点插入链表
	q->data=val;
	if(x==i){//查看插入的位置是否是头结点
		q->next=head;
		head = q;
		return head;
	}
	while(i!=x-1){
		if(p->next==NULL){
			printf("您输入的位置超范围\n");
			return head;
		}
		p=p->next;
		i++;
	}
	q->next=p->next;
	p->next=q;
	return head;
}

7.所有函数集合

#include<stdio.h>
#include<malloc.h>
typedef struct dnode
{
	int data;
	struct dnode *next;
}snode,*ptr;

ptr initlink()//初始化链表并插入元素(向后插入)
{
	ptr head,last,p;
	int x,i,n;
    head=last=(ptr)malloc(sizeof(snode));
    last->next=NULL;
	printf("请输入要输入几个数:");
    scanf("%d",&n);//读入第一个元素
    for(i=0;i<n;i++)//当读的不是结束标记继续循环
    {
		printf("请输入第%d个想加入的数字:",i+1);
		scanf("%d",&x);//读入元素
        p=(ptr)malloc(sizeof(snode));//申请一个存储节点
    	p->data=x;//置结点的值域
    	last->next=p;
    	p->next=NULL;
    	last=p;
    }
    p=head;head=head->next;free(p);//删除辅助结点
    return(head);//返回表头指针
}

void showlink(ptr p){//显示链表所有元素
	printf("您现在的链表为:");
	while(p!=NULL){
		printf("%d  ",p->data);
		p=p->next;
	}
	printf("\n");
}

int findlink(ptr p,int x)
{
	int i=0;
	while(p!=NULL)
	{
		i=i+1;
		if(p->data==x) return i;
		p=p->next;
	}
	return 0;
}

ptr deletelink(ptr p,int x)
{
	ptr head;
	head = p;
	if(head->data==x){//查看头结点是否是要删除的值
		head=head->next;
		return head;
	}
	while(p->next!=NULL){
		if(p->next->data==x)//
		{
			p->next=p->next->next;
			return head;
		}
		p=p->next;
	}
	printf("对不起您要删除的值不存在\n");
	return head;
}

ptr insertlink(ptr p,int x,int val)
{
	ptr head,q;
	int i=1;
	head=p;
	q=(ptr)malloc(sizeof(snode));
	q->data=val;
	if(x==i){
		q->next=head;
		head = q;
		return head;
	}
	while(i!=x-1){
		if(p->next==NULL){
			printf("您输入的位置超范围\n");
			return head;
		}
		p=p->next;
		i++;
	}
	q->next=p->next;
	p->next=q;
	return head;
}
void main()
{
	ptr p;
	int a,b,n;
	p = initlink();
	printf("\n查找操作按1,删除操作按2,插入操作按3:");
	scanf("%d",&n);
	if(n==1){
		printf("请输入想查找的值:");
		scanf("%d",&a);
		b=findlink(p,a);
		if(b!=0)
			printf("您查找的值在第%d个位置\n",b);
		else
			printf("您查找的值不存在\n");
	}else if(n==2){
		showlink(p);
		printf("请输入您要删除的值:");
		scanf("%d",&a);
		p=deletelink(p,a);
		showlink(p);
	}else if(n==3){
		showlink(p);
		printf("请输入插入的位置和插入的值:");
		scanf("%d %d",&a,&b);
		p=insertlink(p,a,b);
		showlink(p);
	}else{
		return 0;
	}
}

猜你喜欢

转载自blog.csdn.net/jiangSummer/article/details/105377000
今日推荐