一.无空间限制带头结点单链表结构体1. 宏定义:#include #include #define OVERFLOW -2#define OK 1#define TRUE 1#define ERROR 0#define FALSE 0 #define ElemType ****;2. 结构体:2. 无空间限制单链表结构体:typedef struct Node{ElemType data; struct Node *next;}Node,*Linklist;3. 基本函数:int Initlist_Linklist_1(Linklist L)/*初始化单链表:1.先决条件:定义一个全局尾指针变量;2.函数作用:初始化链表/{L->next=NULL; tail=L;printf("单链表现初始化了!\n");return OK;}int Initlist_Linklist_2(Linklist L)/*初始化单链表:1.先决条件:初始化结构体数据即L->next=NULL(一次)或执行一次Initlist_Linklist_1,定义一个全局尾指针变量;2.函数作用:删除已有链表,并初始化单链表*/{Node *p,*q; if(p=L->next){while(p){q=p->next; free(p); p=q;}}L->next=NULL; tail=L;printf("单链表现初始化了!\n");return OK;}int Increase_Linklist(Linklist L)/*尾接法增加数据:1.先决条件:先按初始化函数初始化,定义一个全局尾指针变量; 2.函数作用:为单链表 L 增加数据,以标识符“0”结束*/{int panduan; ElemType e; Node *p;printf("输入 0 结束增加数据!\n");do{printf("请输入数据:");scanf("%d",&e);//因 ElemType 不同而不同,特别是字符类型getchar();if(e==0)//因 ElemType 不同而不同,特别是字符类型{printf("再次输入 0 表示结束增加数据,输入非零将把0 增加到数据中.\n"); printf("请输入:");scanf("%d",&panduan); getchar(); if(panduan==0){printf("正常结束增加数据!\n"); return OK;}}p=(Node *)malloc(sizeof(Node)); if(p==NULL){printf("申请空间失败,请稍后再试!\n"); return OVERFLOW;}tail->next=p; tail=p;tail->data=e;tail->next=NULL; e++;}while(e!=0);//因 ElemType 不同而不同,特别是字符类型printf("正常结束增加数据!\n"); return OK;}int Input_Linklist(Linklist L)/*遍历输出函数:1.先决条件:先决条件:先按初始化函数初始化, 使链表为带头结点;2.函数作用:输出单链表中各个数据*/{Node *p; int count=0;for(p=L->next;p!=NULL;p=p->next){printf("%d ",p->data);//会因 ElemType 不同而不同count++;if(count%10==0) printf("\n");}printf("\n"); return OK;}int Delete_Linklist_1(Linklist L)/*删除函数:1.先决条件:初始化单链表或初始化结构体数据即L->next=NULL, 单链表以值(要求为数,不能是字符)排列,定义一个全局尾指针变量;2.函数作用:删除表中所不大于 maxk 且不小于 mink 的元素。
/{ElemType mink,maxk;Node *o,*p,*q;int count=0;printf("删除表中所不大于maxk 且不小于mink 的元素\n"); printf("请输入 mink 和 maxk 值:\n"); scanf("%d%d",&mink,&maxk);//因 ElemType 不同而不同getchar();do{if(maxknext;p!=NULL;p=q){q=p->next;if(mink<=p->data&&p->data<=maxk){}else}free(p);o->next=q; count++;o=p;tail=o;printf("共删除满足条件的结点%d 个!\n",count); return OK;}int ReverseList(Linklist L)/*原地逆置函数:1.先决条件:定义一个全局尾指针变量,带头结点的单链表; 2.函数作用:原地逆置带头结点的单链表*/{Node *o,*p,*q;for(tail=p=L->next,L->next=NULL;p!=NULL;){q=p->next; o=L->next; L->next=p; p->next=o; p=q;}printf("逆置数据成功!\n"); return OK;}int Insert_Linklist_2(Linklist L,int i,ElemType d)/*插入函数:1.先决条件:初始化单链表,拥有计算长度函数,定义一个全局尾指针变量;2.函数作用:在第 i 个位置插入数据d*/{int length; length=Length_Linklist(L); if(i>length+1||i<1)return OVERFLOW; Linklist p,q;p=L;int j;for(j=1;jnext; q=(Linklist)malloc(sizeof(Node)); q->data=d;q->next=p->next; p->next=q; if(p==tail)tail=q; return OK;}int Length_Linklist(Linklist L)/*计算长度函数:1.先决条件:初始化单链表 2.函数作用:计算单链表的长度*/{Linklist p; int count=0;for(p=L;p->next!=NULL;p=p->next) count++;return count;}4.主函数int main(){Node L; Initlist_Linklist_1(&L); int choice,i,d;do{printf("************************************************************\n"); printf("1.初始化链表 2.增加数据 3.删除数据 4.显示数据 5.插入数据\n"); printf("6.退出\n"); printf("************************************************************\n"); printf("请输入选择(1~6):");scanf("%d",&choice); getchar(); switch(choice){case 1:Initlist_Linklist_2(&L);break; case 2:Increase_Linklist(&L);break; case 3:Delete_Linklist_1(&L);break; case 4:Input_Linklist(&L);break;case 5:printf("请输入要插入的位置i 和数据d:");scanf("%d%d",&i,&d); Insert_Linklist_2(&L,i,d);break;case 6:printf("谢谢使用!\n");break;default :printf("输入错误,请重新输入!\n");break;}}while(choice!=6); return 0;}二.带头结点单链表(书本)1. 宏定义#include #include #define datatype **** #define flag ****2. 结构体typedef struct Inode{datatype data; struct Inode *next;}Lnode,*Linklist;3. 基本函数Linklist Init_Linklist()/*初始化单链表函数 1.先决条件:无 2.函数作用:初始化单链表,返回单链表头结点的地址*/{Linklist L; L=(Linklist)malloc(sizeof(Lnode)); L->next=NULL;return L;}Linklist Creat_Linklist_1()/*新建单链表函数 1.先决条件:拥有初始化单链表函数 2.函数作用:用头插法,在表头插入结点,建立单链表,成功后返回单链表头结点的地址*/{Linklist L;Lnode *s;L=Init_Linklist(); datatype x;printf("请输入数据,以'0'结束:\n");/*因 datatype 和实际不同而不同*/scanf("%d",&x);/*因 datatype 不同而不同*/ while(x!=flag)/*因 datatype 不同而不同*/{s=(Linklist)malloc(sizeof(Lnode));s->data=x;s->next=L->next;L->next=s;scanf("%d",&x);/*因 datatype 不同而不同*/}return L;}Linklist Creat_Linklist_2()/*新建单链表函数 1.先决条件:拥有初始化单链表函数 2.函数作用:用尾插法,在表头插入结点,建立单链表,成功后返回单链表头结点的地址*/{Linklist L;Lnode *s,*r;r=L=Init_Linklist(); datatype x;printf("请输入数据,以'0'结束:\n");/*因 datatype 和实际不同而不同*/scanf("%d",&x);/*因 datatype 不同而不同*/ while(x!=flag)/*因 datatype 不同而不同*/{s=(Linklist)malloc(sizeof(Lnode)); s->data=x;r。