#include#include typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; //指向下一节点 }LNode,*linkList; //linkList表示结构体指针类型,链表的类型 //头插法新建链表 linkList CreatList1(linkList &L) //list_Insert { LNode *s; int x; L=(linkList)malloc(sizeof(LNode));//带头结点的链表 L->next=NULL;//L->data里面没有东西 scanf("%d",&x);//从标准输入读取东西 //3 4 5 6 7 9999 while(x!=9999) { s=(LNode*)malloc(sizeof(LNode));//申请一个新空间给s,强制类型转换 s->data=x;//把读取到的值,给新空间的data成员 s->next=L->next;//让新结点的next指针指向链表第一个元素 (第一个放我们数据的元素) L->next=s;//让s作为第一个元素 } return L; } //尾插法新建链表; linkList CreatList2 (linkList &L) //list_Tail { int x; L=(linkList)malloc(sizeof(LNode));//带头结点的链表 LNode* s; LNode*r=L;//r代表链表表尾结点,指向链表尾部 ,初始l相当于r //输入3 4 5 6 7 9999 scanf("%d",&x); while(x!=9999) { s=(LNode*)malloc(sizeof(LNode)); s->data=x;//把读取到的值,给新空间的data成员 r->next=s;//让尾部结点指向新结点 r=s;//r指向新的表尾结点 scanf("%d",&x); } r->next=NULL;//尾结点next指针赋值为NULL return L; } //查找对应位置的值 linkList GetElem(linkList L,int i) { int j = 1; LNode*p=L->next;//让P指向第一个结点 if(i ==0) { return L;//返回头结点 } if(i<1) { return NULL;//i是负值就返回空 } while(p&&jnext; j++; } return p; } //查找值对应的位置 linkList LocateElem(linkList L,int e) { LNode* p=L->next; while(p != NULL&& p->data!=e) { p=p->next; } return p; } //新结点插入第i个位置 bool ListFront_Insert(linkList &L,int i,int e) { LNode* p=GetElem(L,i-1);//拿到插入位置前一个位置地址 if(p==NULL) { return false;//i不对 } LNode*s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return true; } //删除第i个位置元素 bool ListDelete(linkList &L,int i) { LNode*p=GetElem(L,i-1);//获得第i个位置前一个结点地址 if(NULL==p) { return false; } LNode* q=p->next;//q指针指向第i个结点 p->next=q->next; free(q); q = NULL; return true; } //打印链表函数 void PrintList(linkList L) { L=L->next; while (L!=NULL) { printf("%-3d",L->data);//打印当前结点数据 L=L->next;//指向下一结点 } printf("n"); } int main() { linkList L; //链表头,linkList是结构体指针类型 linkList search; //用来存储拿到的某一个节点 //CreatList1(L); //输入数据可以是3 4 5 6 7 9999 CreatList2(L); //输入数据可以为3 4 5 6 7 9999 PrintList(L); //链表打印 search=GetElem(L,3);//查找链表第二个结点的地址 if(search!=NULL) { printf("按序查找成功n"); printf("%dn",search->data);//查找链表第二个结点元素值 } search=LocateElem(L,6);//按值查找 if(search!=NULL) { printf("按值查找成功n"); printf("%dn",search->data);//查找链表data是6的结点地址 } ListFront_Insert(L,1,99);//新结点插入第i个位置 PrintList(L); ListDelete(L,4);//删除第i个结点 PrintList(L); return 0; }



