您的位置:首页 > 理论基础 > 数据结构算法

数据结构(C语言)---单链表的简单应用

2016-04-08 00:00 204 查看
摘要: 数据结构(C语言)---单链表的简单应用#include "stdio.h"#include "stdlib.h"#include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status;typedef int ElemType;typedef struct Node{ElemType data;struct Node *next;}*LinkList;Status GetElem(LinkList L,int i,ElemType e){int j=0;LinkList p=L;while(j{j++;p=p->next;}if(p==NULL)return FALSE;else{e = p->data; return e;}}Status LocateElem(LinkList L, ElemType e){int i = 1;LinkList p=L->next;while(p!=NULL && p->data!=e){p=p->next;i++;}if(p==NULL)return FALSE;elsereturn (i);}Status ListInsert(LinkList *L, int i, ElemType e){int j=0;LinkList p=*L,s;while(j{j++;p=p->next;}if(p==NULL)return FALSE;else{s=(LinkList)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return TRUE;}}Status ListDelete(LinkList *L, int i, ElemType e){int j=0;LinkList p=*L,q;while(j{j++;p=p->next;}if(p==NULL)return FALSE;else{q=p->next;if(q==NULL)return FALSE;e=q->data;p->next=q->next;free(q);return e;}}Status visit(ElemType c){printf("%d ",c);return OK;}Status InitList(LinkList *L){*L=(LinkList)malloc(sizeof(Node));if(!(*L)){return ERROR;}(*L)->next=NULL;return OK;}int ListLength(LinkList L){int i=0;LinkList p=L->next;while(p){i++;p=p->next;}return i;}Status ListTraverse(LinkList L){LinkList p=L->next;while(p){visit(p->data);p = p->next;}printf("\n");return OK;}void CreateListTail(LinkList *L, int n){LinkList p,r;int i;srand(time(0));*L = new Node;r=*L;for (i=0; i < n; i++){p = new Node;p->data = rand()0+1;r->next=p;r = p;}r->next = NULL;// 创建有环链表//r->next = p;}Status GetMidNode(LinkList L, ElemType *e){LinkList search, mid;mid = search = L;while (search->next != NULL){//search移动的速度是 mid 的2倍if (search->next->next != NULL){search = search->next->next;mid = mid->next;}else{search = search->next;}}*e = mid->data;return OK;}int main(){LinkList L;Status i;char opp;ElemType e;Status find;Status tmp;i=InitList(&L);printf("初始化L后:ListLength(L)=%d\n",ListLength(L));printf("\n1.查看链表 \n2.创建链表(尾插法) \n3.链表长度 \n4.中间结点值 \n5.第i个位置的元素值 \n6.确定元素的位置\n7.添加元素噢!\n8.删除元素噢!\n0.退出 \n请选择你的操作:\n");while(opp != '0'){scanf("%c",&opp);switch(opp){case '1':ListTraverse(L);printf("\n");break;case '2':CreateListTail(&L,20);printf("整体创建L的元素(尾插法):\n");ListTraverse(L);printf("\n");break;case '3'://clearList(pHead); //清空链表printf("ListLength(L)=%d \n",ListLength(L));printf("\n");break;case '4'://GetNthNodeFromBack(L,find,&e);GetMidNode(L, &e);printf("链表中间结点的值为:%d\n", e);//ListTraverse(L);printf("\n");break;case '5':printf("你想看哪个位置的元素?\n");scanf("%d", &i);e=GetElem(L,i,e);printf("第%d个数是%d",i,e);printf("\n");break;case '6':printf("请输入你要确定位置的元素:\n");scanf("%d", &e);find=LocateElem(L,e);printf("该值的位置为%d\n", find);break;case '7':printf("请输入你要添加的元素:\n");scanf("%d",&e);printf("请输入你要插入的位置:\n");scanf("%d", &i);tmp=ListInsert(&L,i,e);if(tmp=1)printf("成功!");else printf("失败!");ListTraverse(L);break;case '8':printf("请输入你要释放的元素的位置:\n");scanf("%d", &i);tmp=ListDelete(&L,i,e);printf("元素%d已经被删除\n",tmp);ListTraverse(L);break;case '0':exit(0);}}return 0;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C