赞
踩
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
代码如下(示例):
- #include<stdio.h>
- #include<stdlib.h>
- #include<malloc.h>
- //定义结点
- typedef struct LNode{
- int data; //数据域
- struct LNode * next;//指针域
- }* LinkList,LNode;
代码如下(示例):
- void CreatList(LinkList * L){
- LinkList p,s;
- p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
- p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
- int x;
- printf("请输入元素,选择0即停止输入\n");
- scanf("%d",&x);
- while(x){
- s=(LinkList)malloc(sizeof(LNode));//创建新的结点
- s->data=x; //将数据赋值给新结点的数据域
- s->next=p->next;
- p->next=s;
- scanf("%d",&x);
- }
- }
代码如下(示例):
- void CreatList1(LinkList * L){
- LinkList p,s;
- *L=(LinkList)malloc(sizeof(LNode)); //创建头结点
- p=*L; //创建一直指向表尾的指针
- p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
- int x;
- printf("请输入元素,选择0即停止输入\n");
- scanf("%d",&x);
- while(x){
- s=(LinkList)malloc(sizeof(LNode));//创建新的结点
- s->data=x; //将数据赋值给新结点的数据域
- p->next=s;
- p=s;
- scanf("%d",&x);
- }
- p->next=NULL;
- }

- void InsertList(LinkList * L,int i ,int e){
- if(i<1)
- return;
- LNode * p=*L; //p为指向当前结点的指针
- int j =0; //p指针指向的当前结点,当前位置为头结点
- while(p!=NULL && j<i-1){
- p=p->next;
- j++;
- }
- LNode * s=(LNode *)malloc(sizeof(LNode)); //创建新结点
- s->data = e;
- s->next = p->next;
- p->next =s;
- }
- void DeleteList(LinkList * L,int i){
- if(i<1)
- return;
- LNode * p=*L; //p为指向当前结点的指针
- int j =0; //p指针指向的当前结点,当前位置为头结点
- while(p!=NULL && j<i-1){
- p=p->next;
- j++;
- }
- if(p->next==NULL)
- return;
- LNode * s=(LNode *)malloc(sizeof(LNode));
- s=p->next;
- p->next=s->next;
- free(s);
- }

- void SearchList(LinkList * L,int i){
- if(i<1)
- return;
- LNode * p=*L; //p为指向当前结点的指针
- int j =0; //p指针指向的当前结点,当前位置为头结点
- while(p!=NULL && j<i-1){
- p=p->next;
- j++;
- }
- printf("该值为%d",p->next->data);
- }
- void DestoryList(LinkList * L){
- LinkList p,temp;
- p=(*L)->next;//从第一个结点开始
- while(p!=NULL){
- temp=p->next;
- free(p);
- p=temp;
- }
- (*L)->next=NULL; //让头结点指针指向NULL
-
- }
- void PrintList(LinkList L){
- LinkList p=L->next;
- while(p!=NULL){
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
- #include<stdio.h>
- #include<stdlib.h>
- #include<malloc.h>
- //定义结点
- typedef struct LNode{
- int data; //数据域
- struct LNode * next;//指针域
- }* LinkList,LNode;
- //函数声明
- void CreatList(LinkList * L);//头插法建立链表
- void CreatList1(LinkList * L);//尾插法建立链表
- void InsertList(LinkList * L,int i ,int e);//插入结点
- void DeleteList(LinkList * L,int i);//删除结点
- void SearchList(LinkList * L,int i);//按位序查找结点
- void DestoryList(LinkList * L);//销毁链表
- void DestoryList(LinkList * L);//打印链表
-
-
- //头插法建立单链表
- void CreatList(LinkList * L){
- LinkList p,s;
- p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
- p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
- int x;
- printf("请输入元素,选择0即停止输入\n");
- scanf("%d",&x);
- while(x){
- s=(LinkList)malloc(sizeof(LNode));//创建新的结点
- s->data=x; //将数据赋值给新结点的数据域
- s->next=p->next;
- p->next=s;
- scanf("%d",&x);
- }
- }
- //尾插法创建单链表
- void CreatList1(LinkList * L){
- LinkList p,s;
- *L=(LinkList)malloc(sizeof(LNode)); //创建头结点
- p=*L; //创建一直指向表尾的指针
- p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
- int x;
- printf("请输入元素,选择0即停止输入\n");
- scanf("%d",&x);
- while(x){
- s=(LinkList)malloc(sizeof(LNode));//创建新的结点
- s->data=x; //将数据赋值给新结点的数据域
- p->next=s;
- p=s;
- scanf("%d",&x);
- }
- p->next=NULL;
- }
- //插入结点
- void InsertList(LinkList * L,int i ,int e){
- if(i<1)
- return;
- LNode * p=*L; //p为指向当前结点的指针
- int j =0; //p指针指向的当前结点,当前位置为头结点
- while(p!=NULL && j<i-1){
- p=p->next;
- j++;
- }
- LNode * s=(LNode *)malloc(sizeof(LNode)); //创建新结点
- s->data = e;
- s->next = p->next;
- p->next =s;
- }
- //按位序查找结点
- void SearchList(LinkList * L,int i){
- if(i<1)
- return;
- LNode * p=*L; //p为指向当前结点的指针
- int j =0; //p指针指向的当前结点,当前位置为头结点
- while(p!=NULL && j<i-1){
- p=p->next;
- j++;
- }
- printf("该值为%d\n",p->next->data);
- }
- //删除结点
- void DeleteList(LinkList * L,int i){
- if(i<1)
- return;
- LNode * p=*L; //p为指向当前结点的指针
- int j =0; //p指针指向的当前结点,当前位置为头结点
- while(p!=NULL && j<i-1){
- p=p->next;
- j++;
- }
- if(p->next==NULL)
- return;
- LNode * s=(LNode *)malloc(sizeof(LNode));
- s=p->next;
- p->next=s->next;
- free(s);
- }
- //销毁链表
- void DestoryList(LinkList * L){
- LinkList p,temp;
- p=(*L)->next;//从第一个结点开始
- while(p!=NULL){
- temp=p->next;
- free(p);
- p=temp;
- }
- (*L)->next=NULL; //让头结点指针指向NULL
- //free(*L); 销毁头结点;
-
- }
- //打印链表
- void PrintList(LinkList L){
- LinkList p=L->next;
- while(p!=NULL){
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
-
-
- int main(){
- printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t请输入下列你想要的操作\t\t\n");
- printf("\t\t1.创建链表\t\t\t2.插入结点\t\t\t3.删除结点\t\t\t\n\t\t4.按位查找\t\t\t5.销毁链表\t\t\t6.打印链表\n\t\t0.退出程序\n ");
- int command,num;
- int e;//输入的所需要查找的数值
- int i,a,b,c;//a为输入插入的位置,b为插入的数值,c为需要删除的位置
- LinkList L;
- do{
- scanf("%d",&command);
- switch(command)
- {
- case 1:
- printf("请选择头插法(1)还是尾插法(2)\n<1-2>\n");
- scanf("%d",&num);
- if(num==1) CreatList(&L);
- else if(num==2) CreatList1(&L);
- else printf("输入有误,请重新输入:");
- break;
- case 2: printf("请输入您需要插入的序列:\n");
- scanf("%d",&a);
- printf("请输入需要插入的元素:\n");
- scanf("%d",&b);
- InsertList(&L,a,b);
- break;
- case 3: printf("请输入您需要删除的内容的序号:");
- scanf("%d",&c);
- DeleteList(&L,c);
- break;
- case 4: printf("请输入需要查找的位置:");
- scanf("%d",&i);
- SearchList(&L,i);
- break;
- case 5: DestoryList(&L); break;
- case 6: PrintList(L); break;
- case 0: printf("退出成功"); break;
-
- }
- }while(command);
- }
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。