#include<stdio.h>/*单链表操作(建表、插入、删除、查找、求表长),王红刚2009/06/21完成*/ #include<stdlib.h>/*程序只用作学习交流,如要转载请注明出处!!·*/ #include <malloc.h> #define ERROR 0 #define OK 1 typedef char ElemType; typedef struct Node { ElemType data; struct Node *next; }Node,*LinkList;/*LinkList为结构指针类型,用来说明头指针变量*/ void initlinklist(LinkList *L)/*初始化单链表*/ { *L=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL; } void Create(LinkList L)/*建立单链表*/ { Node *s,*r; char c; int flag=1; r=L; while(flag) { c=getchar(); if(c!='#')/*当输入#时建表结束*/ { s=(Node *)malloc(sizeof(Node)); s->data=c; r->next=s; r=s; } else { flag=0; r->next=NULL; } } } Node *Get(LinkList L,int i)//按序号查找第i个节点,若成功返回存储位置//返回指针值的函数 { int j; Node *p; if(i<=0) return NULL; p=L; j=0; while((p->next!=NULL)&&(j<i)) { p=p->next; j++; } if(i==j)return p; else return NULL; } Node *Locate(LinkList L,ElemType key)//按值查找线性表 { Node *p; p=L->next; while(p!=NULL) if(p->data!=key) p=p->next; else break; return p; } int ListLength(LinkList L)//求单链表的长度 { Node *p;int j=0; p=L->next; while(p!=NULL) { p=p->next; j++; } return j; } int InsList(LinkList L,int i,ElemType e)//在线性表的第i个位置插入值为e的新节点 { Node *pre,*s; int k; if(i<1) return ERROR; pre=L; k=0; while(pre!=NULL&&k<i-1) { pre=pre->next; k++; } if(!pre) { printf("插入位置不合理!"); return ERROR; } s=(Node *)malloc(sizeof(Node)); s->data=e; s->next=pre->next; pre->next=s; return OK; } int DelList(LinkList L,int i,ElemType e)//删除第i个节点 { Node *pre,*r; int k; pre=L; k=0; while(pre->next!=NULL&&k<i-1) { pre=pre->next; k++; } if(!(pre->next)) { printf("删除节点i的值不合理!"); return ERROR; } r=pre->next; pre->next=pre->next->next; e=r->data; free(r); return OK; } void main() { LinkList l; Node *p,*q,*r; int x,len,w,tag,ji,tag1; char m,g,e; initlinklist(&l); printf("建立单链表,请输入链表数据,以#结束!/n"); Create(l); p=l->next; printf("刚才建立的单链表为:/n"); while(p!=NULL) { printf("%c ",p->data); p=p->next; } printf("/n按节点查找 请输入要查找的节点i的值:/n"); scanf("%d",&x); q=Get(l,x); if(q!=NULL) printf("第%d个节点的值是%c",x,q->data); else printf("没有找到该节点!"); printf("/n按值查找 请输入要查找的值:/n"); getchar(); scanf("%c",&m); r=Locate(l,m); if(r!=NULL) printf("/n查找成功!该值是线性表中的值!/n"); else printf("/n没有找到该值!"); len=ListLength(l); printf("/n该线性表的长度是%d.",len); printf("/n/n请输入要插入节点i的值和要插入的值(注意用空格隔开):"); scanf("%d %c",&w,&g); getchar(); tag=InsList(l,w,g); if(tag) { printf("/n插入成功,插入后的序列为:"); p=l->next; while(p!=NULL) { printf("%c ",p->data); p=p->next; } } else printf("插入失败"); printf("/n请输入要删除节点i的值:"); scanf("%d",&ji); getchar(); tag1=DelList(l,ji,e); if(tag1) { printf("/n删除成功,删除后的序列为:"); p=l->next; while(p!=NULL) { printf("%c ",p->data); p=p->next; } } else printf("删除失败"); }