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