/*线性表的单链表存储,并且实现顺序建立链表、逆序建立链表、*****/ /*元素的读取、插入、删除、逆置、合并、输出*****转载来自:http://blog.csdn.net/eugene_l/article/details/12946541***************/ //-----------------头文件---------------------- #include<stdio.h> #include<stdlib.h> //-----------------宏定义---------------------- #define TURE 1 #define FALSE 0 #define ERROR 0 #define OK 1 #define OVERFLOW -2 //-----------------线性表的单链表存储结构------ typedef int elemType; typedef int Bool; typedef struct lNode { elemType data; struct lNode *next; }lNode,*linkList; //----------------子函数----------------------- void createList_L01(linkList L,int n);//逆位序输入n个元素的值,建立带头结点的单链表线性表L void createList_L02(linkList L,int n);//顺位序输入n个元素的值,建立带头结点的单链表线性表L Bool getElem_L(linkList L,int i,elemType &e);//L为带头结点的单链表。读取L中第i个元素,用e返回。 Bool listInsert_L(linkList L, int i, elemType e);//在带头结点的单链线性表L中第i个位置之前插入元素e Bool listDelete_L(linkList L, int i, elemType &e);//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 void mergeList_L(linkList La,linkList Lb,linkList Lc);//已知单链线性表La和Lb的元素按值非递减排列。 //对并La和Lb的到新的单链线性表Lc,Lc的元素也按值的非递减排列。 Bool backList_L(linkList L);//逆置带头结点的单链线性表L。 void outputList(lNode L);//输出单链线性表L中的元素。 //----------------主函数----------------------- int main() { return 0; } //----------------子函数的实现------------------ void createList_L01(linkList L,int n) { linkList p; L->next = NULL; for(int i = n;i > 0; --i) { p = (linkList)malloc(sizeof(lNode)); scanf("%d",&p->data); p->next = L->next; L->next = p; } } void createList_L02(linkList L,int n) { linkList p,q; q = L; q->next = NULL; for(int i = n; i > 0; --i) { p = (linkList)malloc(sizeof(lNode)); scanf("%d",&p->data); p->next = q->next; q->next = p; q = p; } } Bool getElem_L(linkList L,int i,elemType &e) { linkList p = L; int j = 1; while(p&&j < i) { p = p->next; j++; } if(!p ||j > i)return ERROR; e = p->data; return OK; } Bool listInsert_L(linkList L, int i, elemType e) { linkList p = L,s; int j = 1; while(p && j <= i - 1) { p = p->next; j++; } if(!p || j > i) return ERROR; s = (linkList)malloc(sizeof(lNode)); s->data = e; s->next = p->next; p->next = s; return OK; } Bool listDelete_L(linkList L, int i, elemType &e) { linkList p = L; int j = 1; while(p->next && j < i) { p = p->next; ++j; } if(!(p->next) || j > i) return ERROR; linkList q = p -> next; p->next = q->next; e = q->data; free(q); return OK; } void mergeList_L(linkList La,linkList Lb,linkList Lc) { Lc ->next = La ->next; linkList pa = La -> next; linkList pb = Lb -> next; linkList pc; pc = La; while(pa&&pb) { if(pa->data <= pb->data) { pc->next = pa; pc = pa; pa = pa->next; } else { pc->next = pb; pc = pb; pb = pb ->next; } } pc ->next = pa ? pa : pb; } Bool backList_L(linkList L) { linkList p ,q; p = q = L -> next; L ->next = NULL; while(q) { p = q ->next; q ->next = L->next; L->next = q; q = p; } return OK; } void outputList(lNode L) { linkList p = L.next; while(p) { printf("%d ",p->data); p = p->next; } }