单链表的基本操作实现(c语言实现)
这是我自己写的用c语言实现单链表的基本操作的代码,内容简单,容易理解,因为其他博主写的代码不易理解,主要看主函数,在此分享给大家,经过测试是可以运行的,我不做过多的讲解,一些算法思想大家可以去参考其他博主写的教程,他们说的非常详细,我分享的目的是主要让新手体会一下,学习如何用c语言实现单链表的基本操作,代码一些注释可能有误,希望大家谅解,也请各位大佬明确指出!大家可以参考耿国华的《数据结构》 ——时雨
#include
#include
#include
#define ok 1;
#define error 0;
typedef int elemtype;
typedef struct node
{elemtype data;//数据域struct node *next;//指针域,指向下一节点
} node,*linklist;
//函数声明
void createfromhead (linklist L);//头插法建表
void output(linklist L);//遍历输出
void createfromtail(linklist L);//尾插法建表
int listlength(linklist L);//单链表的长度
node* getdata(linklist L,int i);//按序号查找
node* locate(linklist L,elemtype key);//按内容查找
int inslist(linklist L,int i,elemtype e);//插入
int dellist(linklist L,int i,elemtype *e);//删除
void main()
{elemtype a,b,d,e,i,t,y,j=1;linklist L;//头指针 //单链表的初始化 L=(linklist)malloc(sizeof(node));L->next=NULL;//null为空指针 printf("建立单链表,1代表头插法,0代表尾插法\n");printf("请选择: ");scanf("%d",&a);if(a==1) {//接下来利用头插法建表 printf("利用头插法建表\n");printf("请输入各元素(数字),并使用空格隔开,注意0为结束标志\n");createfromhead (L);printf("头插法建立成功各元素为:");}else{//接下来利用尾插法建表 printf("利用尾插法建表\n");printf("请输入各元素(数字),并使用空格隔开,注意0为结束标志\n");createfromtail(L);printf("尾插法建立成功各元素为:");}output(L);printf("\n");//接下来是求单链表的长度printf("\n单链表的长度为 %d",listlength(L));//接下来是按序号查找printf("\n开始按序号查找\n");printf("请输入需要查找的位置\n");printf("请输入:");scanf("%d",&b);if(getdata(L,b)==NULL)printf("查找失败\n");elseprintf("查找成功 查找的值为:%d\n",getdata(L,b)->data);//接下来是按内容查找printf("\n开始按内容查找\n");printf("请输入需要查找的内容\n");printf("请输入:");scanf("%d",&d); //接下来是按内容查找 if(locate(L,d)==NULL)printf("查找失败\n");else{node *s;for (s=L->next;s!=locate(L,d);s=s->next)j++;printf("查找成功 查找的位置为:%d\n",j);}//接下来是插入printf("开始进行插入\n");printf("\n请输入插入的位置:");scanf("%d",&i);printf("\n请输入插入的元素:");scanf("%d",&e);if(inslist(L,i,e)==0)printf("\n插入失败!\n");elseprintf("\n插入成功!\n");output(L);//接下来是删除printf("\n开始进行删除操作\n");printf("请输入删除的位置:");scanf("%d",&t);if(dellist(L,t,&y)==0)printf("\n删除失败!\n");else{printf("删除成功,这些元素分别为 "); output(L);}system("pause");
}void createfromhead (linklist L)//利用头插法建立单链表
{node *s;elemtype c;int flag=1;while(flag){scanf("%d",&c);if(c!=0)//输入0时建表结束 {s=(node*)malloc(sizeof(node));//建立新的结点 s->data=c;//将c的值赋值给s的数据域 s->next=L->next;//指针域互换 L->next=s;//将s的地址赋给上一个结点的地址 }else flag=0;}
} void output(linklist L)//遍历输出
{node *p;for (p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);
}void createfromtail(linklist L)//尾插法建表
{node *r,*s;//*r是尾指针elemtype c, flag=1;//标志r=L;//动态指向当前表尾while(flag){scanf("%d",&c);if(c!=0){s=(node*)malloc(sizeof(node));s->data=c;r->next=s;r=s;} else{flag=0;r->next=NULL;//最后一结点指针域为空 }}
} int listlength(linklist L)//求单链表的长度
{elemtype j;node *p;p=L->next;j=0;//用来存放单链表的长度while(p!=NULL){p=p->next;j++; }return j;//单链表的长度
} node* getdata(linklist L,int i)//按序号查找
{int j;//j为计数器node *p;if(i<=0) return NULL;p=L;j=0;while((p->next!=NULL)&&(jnext;j++;}if(i==j)return p;//找到第i个节点 else return NULL;
}node* locate(linklist L,elemtype key)//按内容查找
{node *p;p=L->next;while(p!=NULL)if(p->data!=key)p=p->next;elsebreak;//退出循环return p;
}int inslist(linklist L,int i,elemtype e)//单链表的插入
{node *pre,*s;int k;if(i<=0)//插入的位置不合法return error;pre=L;k=0;while(pre!=NULL&&knext;k=k+1;}//查找第i-1个结点if(pre==NULL)//插入位置不合法return error;s=(node*)malloc(sizeof(node));//申请一个新的结点s->data=e;//e放到s的数据域s->next=pre->next;//pre next域替换成 s next域pre->next=s; return ok;
} int dellist(linklist L,int i,elemtype *e)//将删除的元素保存到变量*e
{node *pre,*r;int k; pre=L;k=0;while(pre->next!=NULL&&knext;k=k+1;}if(pre->next==NULL)//前驱位置没有找到,删除不合法 return error;r=pre->next;//r赋值删除的位置 pre->next=r->next;//删除结点*e=r->data;free(r);//释放return ok;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
