#include<stdio.h> #include<stdlib.h> #include<math.h> typedef int DataType; typedef struct node{/*结点类型定义*/ DataType data;/*结点的数据域*/ struct node *next;/*结点的指针域*/ }ListNode,*LinkList; ListNode *p; LinkList head; /*注意:定义结点结构时,有几点需要注意:LinkList和ListNode *是不同名字的同一个指针类型,LinkList类型的指针变量head表示他是单链表的头指针,ListNode *类型的指针变量p表示它是指向某一结点的指针*/ LinkList InitList() { LinkList L; L=(ListNode*)malloc(sizeof(ListNode)); if(L==NULL) { printf("分配空间失败!"); exit(1); } L->next=NULL; return L; } LinkList CreatListF() {/*头插法建立单链表*/ DataType x; LinkList L; ListNode *s; L=(ListNode *)malloc(sizeof(ListNode));/*头结点*/ if(L==NULL)/*检查L是否分配到储存空间*/ { printf("分配空间失败!"); exit(1); } L->next=NULL; scanf("%d",&x); while(x!=0) { s=(ListNode *)malloc(sizeof(ListNode));/*为新插入的结点申请空间*/ if(s==NULL) { printf("分配空间失败!"); exit(1); } s->data=x; s->next=L->next; L->next=s; scanf("%d",&x); } return L; } LinkList CreatListL() {/*尾插法建立单链表*/ DataType x; LinkList L=(ListNode *)malloc(sizeof(ListNode));/*头结点*/ if(L==NULL) { printf("分配空间失败!"); exit(1); } ListNode *s,*r; r=L; scanf("%d",&x); while(x!=0)/*以0输入表示结束*/ { s=(ListNode *)malloc(sizeof(ListNode));/*为新插入的结点申请空间*/ if(s==NULL) { printf("分配空间失败!"); exit(1); } s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL;/*单链表的最后一个指针为空*/ return L; } int GetLength(LinkList L) { int num=0; ListNode *p; p=L->next; while(p!=NULL) { num++; p=p->next; } return(num); } ListNode *GetNode(LinkList L,int i) { int j=1; ListNode *p; if(i<1||i>GetLength(L)) { printf("查找的位置不正确!"); exit(1); } p=L->next; while(p!=NULL&&j<i) { p=p->next; j++; } return p; } int LocateListi(LinkList L,DataType x) { ListNode *p=L->next; int i=1; while(p!=NULL&&p->data!=x) { p=p->next; i++; } if(p==NULL) return 0; else return i; } void InsertList(LinkList L,DataType x,int i) { ListNode *p,*q,*s; int j=1; p=L; if(i<1||i>GetLength(L)+1) { printf("插入位置不正确!"); exit(1); } s=(ListNode *)malloc(sizeof(ListNode)); if(s==NULL) { printf("分配空间失败!"); exit(1); } s->data=x; while(j<=i) { q=p; p=p->next; j++; } s->next=p; q->next=s; } void DeleteList(LinkList L,int i) { ListNode *p,*q; int j=1; p=L; if(i<1||i>GetLength(L)) { printf("删除位置不正确!"); exit(1); } while(j<i) { p=p->next; j++; } q=p->next; p->next=q->next; free(q); } void PrintList(LinkList L) { ListNode *p; p=L->next; printf("链表元素如下:\n"); while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } int main() { DataType a; head=InitList(); printf("我们将采用头插法创建一个单链表L!\n请输入您要输入的数据(以空格隔开,以0结束!)\n"); head=CreatListL(); printf("单链表的长度为:%d\n",GetLength(head)); printf("请输入您要查找元素的结点序号:"); scanf("%d",&a); printf("第%d个元素为:%d\n",a,GetNode(head,a)->data); printf("请输入您要查找的元素:"); scanf("%d",&a); printf("您查找的元素%d在链表中的第%d个位置\n",a,LocateListi(head,a)); int x,i; printf("请输入您要插入元素的数值以及位置:"); scanf("%d%d",&x,&i); InsertList(head,x,i); PrintList(head); printf("请输入您想要删除元素的位置:"); scanf("%d",&i); DeleteList(head,i); PrintList(head); return 0; }