C语言数据结构——单链表

来源:互联网 发布:nginx 配置多个域名 编辑:程序博客网 时间:2024/06/06 01:22

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre"></span>数据结构的一些讲解,供学习者参考,也顺带作为复习     </span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">        链表与顺序表不同,它是一种动态的存储结构,链表中每个结点占用的存储空间不是预先分配的,而是运行时系统根据需求生成的,因此建立单链表从空表开始,每读入一个数据元素则申请一个结点,然后插在链表的头部。下图为链表的构建过程,因为是在链表的头部插入,读入数据的顺序表和线性表的逻辑顺序是相反的。</span>


链表建立

LinkList Creat_LinkList(){LNode *s;int x;printf("请输入数据(输入'0'表结束输入):\t");scanf("%d",&x);while(x!=0){s=(LNode *)malloc(sizeof(LNode));s->data=x;s->next=L;L=s;printf("请输入数据(输入'0'表结束输入):\t");scanf("%d",&x);}return L;}

获取某个位置的数据

LNode *Get_LinkList(LinkList L,int i){LNode *p=L;int j=0;while(p->next!=NULL&&j<i){p=p->next;j++;}if(j==i)return p;else return NULL;}

定位到某个元素的结点

LNode *Locate_LinkList(LinkList L,int x){LNode *p=L->next;while(p!=NULL&&p->data!=x)p=p->next;return p;}

插入算法1,i为插入的位置,x为插入的元素

int Insert_LinkList_1(LinkList L,int i,int x){LNode *p,*s;p=Get_LinkList(L,i-1);if(p==NULL){printf("参数i错误\n");return 0;}else {s=(LNode *)malloc(sizeof(LNode));s->data=x;s->next=p->next;p->next=s;return 1;}}

插入算法2:表头插入

LinkList Insert_LinkList_2(LinkList L,int x){LNode *s;s=(LNode *)malloc(sizeof(LNode));s->data=x;s->next=L;L=s;return L;}

删除链表某个位置的元素
int Del_LinkList(LinkList L,int i){LinkList p,s;p=Get_LinkList(L,i-1);if(p==NULL){printf("第i-1个结点不存在\n");return -1;}else if(p->next==NULL){printf("第i个结点不存在\n");return 0;}else{s=p->next;p->next=s->next;free(s);return 1;}}

计算链表的长度

int Length_LinkList(LinkList L){LNode *p=L;int j=0;while(p){p=p->next;j++;}return j;}

输出链表内的所有元素

void OutputList(LinkList L){LNode *p=L;while(p){printf("%4d",p->data);p=p->next;}}

主函数设计

void main(){LinkList H=NULL;int item,model,addr;while(1){printf("请选择操作:\n【1】创建链表\n【2】特定位置插入数据\n【3】表头插入数据\n【4】特定元素删除\n【5】表长度\n【6】查看链表\n【7】退出\n");printf("请输入:\t");scanf("%d",&model);fflush(stdin);switch(model){case 1:H = Creat_LinkList();OutputList(H);break;case 2:while(1){printf("请输入插入的位置\t");scanf("%d",&addr);if(addr==0)break;printf("请输入插入的数据\t");scanf("%d",&item);Insert_LinkList_1(H,addr,item);}OutputList(H);break;case 3:while(1){printf("请输入插入的数据\t");scanf("%d",&item);if(item==0)break;H=Insert_LinkList_2(H,item);}OutputList(H);break;case 4:while(1){printf("请插入删除的位置\t");scanf("%d",&addr);if(addr==0)break;Del_LinkList(H,addr);}OutputList(H);break;case 5:printf("%d\n",Length_LinkList(H));break;case 6:OutputList(H);printf("\n");break;case 7:exit(0);default:printf("输入有误,请重新输入\n");}}}


运行程序图



需要源代码的欢迎下载,免积分,共同学习,家下来每天都会分享一篇,持续一个星期

http://download.csdn.net/detail/kevin_iot/9395889


0 0
原创粉丝点击