数据结构---C语言单链表基本操作
来源:互联网 发布:微博域名是什么 编辑:程序博客网 时间:2024/06/01 18:26
#include"stdio.h" //单链表基本操作---头节点第0个,第一个节点第1个#include"stdlib.h"#define Elemtype inttypedef struct Lnode{ struct Lnode *next; Elemtype value;}Lnode,*Linklist;Lnode *tail = NULL;/*************空链表的初始化************************/int Initlist(Linklist *L){ *L=(Linklist)malloc(sizeof(Lnode)); if(!*L) //L为二级指针 return 0; else { (*L)->next=NULL; (*L)->value=0; tail = *L; return 1; }}/***********获得尾节点******************************///---------------------------------------------------Linklist get_tail(Linklist L){ Linklist p = L; if(L==NULL) { printf("error!\n"); } while(p->next) { p=p->next; } return p; //p指向尾结点}/***********头插法建立单链表************************/ //head不动int Buildlist1(Linklist L,Elemtype m) //L 为一直指向空的头节点头指针,此头插法为已经初始化的情况下{ Linklist b; b=(Linklist)malloc(sizeof(Lnode)); if(b==NULL) return 0; b->next=L->next; L->next=b; b->value=m;}/**************尾插法建立单链表***************************/ //尾巴动int Buildlist2(Linklist L,Elemtype m){ Linklist b; tail = get_tail(L); b=(Linklist)malloc(sizeof(Lnode)); if(b == NULL) return 0; b->next=NULL; tail->next=b; b->value=m; tail=b;}/*****************遍历***********************/int printlist(Linklist L){ Linklist p=L; if(p->next==NULL) { printf("empty linklist!\n"); return 0; } while(p->next)//跳过了第一个空节点的值 { p=p->next; printf("%d\t",p->value); } printf("\n");}/****************求表长***********************/int lengthlist(Linklist L)//不算头节点{ int i=0; Linklist p=L; while(p->next) { i++; p=p->next; } return i;}/****************向线性表中插入一个元素**********************/int add_elem(Linklist L,Elemtype m,int n) //将p定位到要插入的位置之前,删除同理,n为要插入到的位置{ Linklist p=L,q; int i=0; while(p&&(i+1<n)) { i++; p=p->next; } if((i+1>n)||!p) { printf("error!\n"); //和删除有区别,因为一个0-----n的链表插入下标的范围为1-----n+1 return 0; } q=(Linklist)malloc(sizeof(Lnode)); q->next=p->next; p->next=q; q->value=m; return 1;}/****************从表中删除一个元素*************************/int delate_elem(Linklist L,Elemtype *m,int n) //n是位置,头节点不能删除,所以从1开始数{ Linklist p=L,q; int i=0; while(p&&(i+1<n)) //找到要删除元素的前驱 { i++; p=p->next; } if((i+1>n)||!(p->next)) { printf("error!\n"); return 0; } *m=p->next->value; q=p->next->next; //这里注意p->next->next要先保存,不然把 p->next free掉后就找不到乐 free(p->next); p->next=q; return 1;}/******************在表中查找第n个数并返回值和指针*******************/Linklist get_elem(Linklist L,Elemtype *m,int n){ Linklist p=L->next; int i=1; while(p&&i<n) { i++; p=p->next; } if(i>n||!p) { printf("error!\n"); } *m=p->value; return p;}/********************单链表的销毁**********************/int destroy_list(Linklist *L) //Free函数的参数一定要是malloc返回的那个指针,用*L为了销毁头节点{ Linklist p=*L; while(p) { p=(*L)->next; free(*L); (*L)=p; } return 1;}/*******************单链表的置空**********************/ //只剩头节点int empty_list(Linklist L){ Linklist p,q=L->next; while(q) { p=q->next; free(q); q=p; } L->next=NULL; //忘记这里乐 return 1;}/*************************判断单链表是否为空*****************/int if_empty(Linklist L){ if(L->next==NULL) return 1; return 0;}/******************单链表的连接(2接到1上)********************/void linklinklist(Linklist L1,Linklist L2){ Linklist L=L1; while(L->next) { L=L->next; } L->next=L2->next; //注意这里要把L2的头节点跳过}/***************两个结点的交换**********************************/void swap_value(Linklist L,int pos1,int pos2)//注意,链表中涉及到交换的,只交换值,不交换指针,反正都是一样大的空间!{ int i=0,j=0,value1=0,value2=0; Linklist L1,L2; L2= L1=NULL; Linklist head=L->next; L1=get_elem(L,&value1,pos1); L2=get_elem(L,&value2,pos2); L1->value = value2; L2->value = value1;}/************比较大小并交换值*********************************/void exchange(int *p1,int *p2) //比较大小,如果a>b则交换{ int a; a=*p1; *p1=*p2; *p2=a;}/*******************单链表的冒泡排序************************/int orderlist(Linklist L) //有头节点{ Linklist phead; int len; int i,j; len=lengthlist(L); if(L->next==NULL) { printf("单链表为空,无法排序!\n"); return 0; } for(i=0;i<len-1;i++) { phead=L->next; for(j=0;j<len-i-1;j++) { if(phead->value > phead->next->value) exchange(&(phead->value),&(phead->next->value)); phead=phead->next; } }}/******************单链表的合并(1)******************************/int togetherlist(Linklist L1,Linklist L2,Linklist *L3) //L3有头节点,针对有序链表{ int len1,len2,len3=0,i=0,j=0,k=0; Linklist b,tail; len1=lengthlist(L1); len2=lengthlist(L2); orderlist(L1); orderlist(L2); L1=L1->next; L2=L2->next;//因为之前有头节点 *L3=(Linklist)malloc(sizeof(Lnode)); (*L3)->value=0; if(*L3==NULL) return 0; tail=*L3; //尾插法建立L3 /*while((i<len1-1)&&(j<len2-1)) //不删除重复元素 { b=(Linklist)malloc(sizeof(Lnode)); b->next=NULL; tail->next=b; tail=b; if((L1->value)<=(L2->value)) { i++; b->value=L1->value; L1=L1->next; } else { j++; b->value=L2->value; L2=L2->next; } k++; }*/ while((i<len1)&&(j<len2)) //删除重复元素 { b=(Linklist)malloc(sizeof(Lnode)); b->next=NULL; tail->next=b; tail=b; if((L1->value)<(L2->value)) { i++; b->value=L1->value; L1=L1->next; } else if((L1->value)==(L2->value)) { i++; j++; b->value=L1->value; L1=L1->next; L2=L2->next; } else { j++; b->value=L2->value; L2=L2->next; } k++; } while(i<len1) { b=(Linklist)malloc(sizeof(Lnode)); b->next=NULL; tail->next=b; tail=b; i++; b->value=L1->value; L1=L1->next; } while(j<len2) { b=(Linklist)malloc(sizeof(Lnode)); b->next=NULL; tail->next=b; tail=b; j++; b->value=L2->value; L2=L2->next; } (*L3)->value=k;}/****************主函数***************************/int main(void){ int a=0; int i; Elemtype m=100; Linklist L1,L2,L3; srand((unsigned)time(NULL)); if(!Initlist(&L1)) { printf("ERROR!\n"); } if(!Initlist(&L2)) { printf("ERROR!\n"); } for(i=0;i<3;i++) { Buildlist2(L1,rand()%100); } for(i=0;i<5;i++) { Buildlist2(L2,rand()%100); } printlist(L1); printlist(L2); togetherlist(L1,L2,&L3); printlist(L3);}
阅读全文
0 0
- 数据结构---C语言单链表基本操作
- 数据结构—单链表的部分基本操作(C语言)
- C语言数据结构单链表的一些基本操作
- 《数据结构与算法》-单链表基本操作的C语言实现
- 数据结构--单链表的基本操作(C语言实现)
- 数据结构--单链表的基本操作(C语言实现)
- c语言实现单链表数据结构及其基本操作
- C语言-单链表的基本操作-严蔚敏版的数据结构
- 数据结构---C语言顺序栈基本操作
- c语言数据结构--单链表操作
- C语言单链表基本操作
- 数据结构(C语言)读书笔记4:栈及基本操作
- 数据结构.二叉树的基本操作(C语言实现)
- C语言数据结构之线性表的基本操作
- 数据结构 (C语言)顺序表的基本操作
- 【基本数据结构】C语言基于数组的栈操作
- C语言(数据结构) - 链表的基本操作
- C语言(数据结构) - 双向链表的基本操作
- 你的创业,为什么那么怕融不到钱?
- 线上创业大赛 允许“互相伤害”
- PHP新的垃圾回收机制:Zend GC详解
- Java进制的表示方法
- java之SimpleDateFormat时间格式化
- 数据结构---C语言单链表基本操作
- 对话框
- 最长公共子序列、子串
- 动态规划L
- 体验Project Fi后,Google推出的这张特殊“SIM卡”还有很长的路要走
- 报错call 'refresh' before multicasting events via the context:org.springframework.boot.web.servlet.con
- GoPro第二财季继续亏损 敢问路在何方?
- 企鹅智酷《2016年手机安全报告》:iPhone骚扰电话受关注
- Dan Dodge:从QNX创始人到黑莓汽车软件主管,再到苹果Project Titan负责人