#include<stdio.h> #include<stdlib.h> typedef int elemType; typedef struct Node{//定义单链表节点类型 elemType data; Node *next; }Node,*linkList; //初始化链表,单链表的头指针为空 int initList(linkList &L) { L= (Node *)malloc(sizeof(Node)); if(!L) exit(-1); L->next= NULL; return 1; } int destoryList(linkList &L) { Node *p; while(L) { p=L->next; free(L); L=p; //? } return 1; } //将L重置为空链表 int clearList(linkList &L) { Node *p,*q; if(L==NULL) return 0; p=L->next; while(p!=NULL) { q=p->next; free(p); p=q; } L->next=NULL; return 1; } //判断单链表是否为空 int isEmptyList(linkList &L) { if(L->next) return 0; else return 1; } //返回单链表中的个数 int listLength(linkList &L) { int i=0; Node *p=L->next; while(p) { i++; p=p->next; } return i; } //取得第i个元素 int getElem (linkList L,int i,elemType &e) { int j=0; Node *p=L->next; while(p&&j<i-1) { p=p->next; j++; } if(!p||j>i-1) { return -1; } e=p->data; return 1; } //查询e的位置 int locateElem(linkList L,elemType e) { int i=0; linkList p= L->next; while(p) { i++; if(p->data==e) return i; p=p->next; } return 0; } //返回前驱 int priorElem(linkList L,elemType pro_e) { linkList q,p=L->next; while(p->next) { q=p->next; if(q->data==pro_e) { return p->data; } p=q; } } //返回后继 int nextElem(linkList L,elemType next_e) { linkList p; p=L->next; while(p->next) { if(p->data==next_e) return p->next->data; p=p->next; } return -1; } //在第i个位置插入e int insertList(linkList &L,int i,elemType e) { int j=0; linkList p=L,s=NULL; while(p&&j<i-1) { p=p->next; j++; } if(!p||j>i-1) return -1; s=(linkList )malloc(sizeof(Node)); s->data=e; s->next=p->next; p->next=s; return 1; } //删除第i个元素 e为返回的删除 的元素 int deleteList(linkList &L,int i,elemType &e) { linkList p=L,q; int j=0; if(!p||j>i-1) return -1; while(p->next!=NULL&&j<i-1) { p=p->next; j++; } q=p->next; p->next=q->next; e=q->data; free(q); return 1; } //打印链表 void printList(linkList L) { linkList p=L->next; for(int i=0;i<listLength(L);i++) { printf("%d ",p->data); p=p->next; } printf("\n"); } int main() { linkList L; elemType e; initList(L); //destoryList(L); clearList(L); printf("%d\n",listLength(L)); for(int i=1;i<10;i++) //i>0&&i<listLength { insertList(L,i,i); } printList(L); getElem(L,7,e); printf("%d\n",e); printf("%d\n",priorElem(L,5)); deleteList(L,2,e) ; printf("%d\n",e); printList(L); printf("%d\n",priorElem(L,5)); printf("%d\n",nextElem(L,5)); }
原文地址:http://blog.csdn.net/whk100312/article/details/26389833