首页 > 代码库 > 10、单链表操作
10、单链表操作
单链表操作
单链表操作1
/*单链表的类型定义*/ typedef int DataType; typedef struct node { DataType data; struct node * next; }LinkNode, *LinkList; /*单链表的定位运算*/ LinkNode *Locate(LinkNode *L, int k)//????为什么此处是LinkNode *Locate()类型,表示什么意思 { LinkNode *p; int i; i= 1; p = L->next; //初始时p指向第一个元素结点,i为计数器 while(p != NULL && i < k ) //通过链接指针逐个向后查找第k个结点 { p = p->next; i++; } if(p != NULL && i == k) //存在第k个元素且指针p指向该元素结点 return p; return NULL; //第k个元素不存在 }; /*单链表的插入运算*/ int Insert(LinkNode *L, int k, int elem) { LinkNode *p, *q; if(k==1) p=L; //元素elem插入在第1个元素位置 else p = Locate(L, k-1); //查找表中的第k-1个元素 if(p==NULL) return 0; //表中不存在第k-1个元素,插入失败 q = new LinkNode; //创建插入结点 if(q == NULL) { printf("存储分配失败!\n"); return 0; } q->data = http://www.mamicode.com/elem; //元素elem插入第k-1个元素之后>
单链表操作2
//指向结点的指针是结构体指针类型,链表是结构体指针类型???? #include<stdio.h> //带头结点的链表操作 #include<stdlib.h> #define ERROR 0 #define OK 1 #define OVERFLOW -1 typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; //next指向了一个和它本身数据类型一样的下一个结点 }LNode,*LinkList; //LNode等价于struct LNode; LinkList等价于struct LNode * void GetElem(LinkList L,int i,ElemType *e) //查找第i个元素并返回,函数是无返回值类型 { LNode *p; //ElemType *e用于存储返回的值,LNode *p等价于LinkList p int j=1; p=L->next; //p=L->next,此时p指向首结点 while(p&&j<i) //如果结点为空就停止循环 { p=p->next;++j; } if(!p||j>i)printf("不存在,查找错误\n"); else *e=p->data; } void ListInsert_L(LinkList *L,int i,ElemType e)//插入元素。 { LinkList p=*L,s=NULL; //LinkList *L?????LinkList p=*L int j=0; while(p&&j<i-1){p=p->next;++j;} if(!p||j>i-1)printf("插入位置错误\n"); s=(LinkList)malloc(sizeof(LNode)); s->data=http://www.mamicode.com/e;"删除位置错误"); q=p->next;p->next=q->next; *e=q->data; free(q); } void CreatList(LinkList *L,int n)//建立链表 输入n个ElemType类型的数 { LinkList p=NULL,q=NULL; int i; ElemType m; (*L)=(LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; p=(LinkList)malloc(sizeof(LNode)); p->next=NULL; q=p; scanf("%d",&m); p->data=http://www.mamicode.com/m;"%d",&m); p->data=http://www.mamicode.com/m;"%d ",p->data); p=p->next; } printf("\n"); } int main() { LinkList L=NULL; int i,p=1,m; ElemType e; printf("请输入10个元素:\n"); CreatList(&L,10); printf("原来的10个元素为:"); DisList(L); while(p) { printf("1)插入2)删除3)查找4)显示操作结果0)退出\n"); scanf("%d",&m); switch(m) { case 1:printf("请分别输入要插入元素的位置及与元素值: "); scanf("%d%d",&i,&e);ListInsert_L(&L,i,e);break; case 2:printf("请分别输入要删除元素的位置: "); scanf("%d",&i);ListDelet_L(&L,i,&e);printf("删除的元素值为:%d\n",e);break; case 3:printf("请分别输入要查找的元素的位置: "); scanf("%d",&i);GetElem(L,i,&e);printf("该位置的元素为:%d\n",e);break; case 4:DisList(L);break; case 0:p=0;break; } } return 0; }
单链表的插入3
#include"stdio.h" #include"malloc.h" #include"stdlib.h" /*尾插法建立链表,链表元素顺序和数组一致*/ LinkList CreatList2(LinkList &L) { //从表头到表尾正向建立单链表L,每次均在表尾插入元素 int x; // 设元素类型为整型 L=(LinkList)malloc(sizeof(LNode)); LNode *s, *r=L; //r 为表尾指针 scanf ("%d", &x); //输入结点的值 while (x!=9999) { //输入 9999 表示结束 s=(LNode *)malloc(sizeof(LNode)); s->data=http://www.mamicode.com/x;"%d", &x); } r->next = NULL; //尾结点指针置空 return L; } /*头插法建立链表,链表元素顺序和数组相反*/ LinkList CreatList1(LinkList &L) { //从表尾到表头逆向建立单链表L,每次均在头结点之后插入元素 LNode *s;int x; L=(LinkList)malloc(sizeof(LNode)); //创建头结点 L->next=NULL; //初始为空链表 scanf("%d", &x); //输入结点的值 while(x!=9999) { //输入 9999 表示结束 s=(LNode*)malloc(sizeof(LNode) ); //创建新结点 s->data=http://www.mamicode.com/x;"%d", &x); } //while 结束 return L; } int main (void) { return 0; }
单链表的操作4
/*The Data Structure of Link List*/ typedef int DataType; typedef struct LinkNode { DataType data; struct LinkNode *next; }*LinkList; /*尾插法建立链表,链表元素顺序和数组一致*/ void CreateList(LinkList &L,DataType A[],int n) { LinkNode *rear; L = rear = new LinkNode; for(int i=0; i<n; ++i) { rear->next = new LinkNode; rear = rear->next; rear->data = http://www.mamicode.com/A[i]; " "; } cout<<endl; } *链表的排序算法*/ void InsertSortList(LinkList &L) { LinkNode *p = L->next; /*指向 待插入 结点 */ LinkNode *nextp = NULL; /*指向 p的后继 结点 */ LinkNode *q = L; /*指向有序链表的头部*/ q->next = NULL; while( p != NULL ) { q = L; while(q->next!=NULL && p->data >= q->next->data) /*寻找插入位置,循环停止时,p应插入到q的后面*/ { q = q->next; } nextp = p->next; p->next = q->next; /* p 的后继应是 q */ q->next = p; p = nextp; } } /*链表查找算法*/ LinkNode *SearchList(LinkList &L,DataType x) { LinkNode *p = L->next; while( p!=NULL && p->data!=x ) { p = p->next; } return p; } /*链表销毁算法*/ void DestroyList(LinkList &L) { if(L->next==NULL) { cout<<"delete"<<L->data<<endl; delete L; } else { DestroyList(L->next); cout<<"delete"<<L->data<<endl; delete L; } }
10、单链表操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。