#include<iostream> using namespace std; typedef struct Node { int data; struct Node *next; }SLNode, *LinkList; int len; void SLLInitiate(SLNode **head) //初始化 { /*如果有内存空间,申请头结点空间并使头指针head指向头结点*/ if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1); (*head)->next = NULL; //置链尾标记NULL } int SLLCreate(LinkList &head) //建立单链表 { //逆位序输入n个元素的值,建立带表头结点的单链线性表L cout << "Input the amount of List:" << endl; cin >> len; head=(LinkList)malloc(sizeof(SLNode)); head->next = NULL; //先建立一个带头结点的单链表 cout << "Input the List:" << endl; for(int i=0;i<len;++i) { LinkList p=(LinkList)malloc(sizeof(SLNode)); scanf("%d", &p->data); //输入元素值 p->next = head->next; //插入到表头 head->next = p; } return 0; } void SLLDisplay(LinkList head) //对单链表进行输出 { LinkList L = head; head = head->next; printf("The list is:"); while(head) { printf("%d ",head->data); head = head->next; } head = L; cout << endl; } LinkList SLLLocate(LinkList head, int i)//搜索第i个元素并置为当前元素 { if(i<=0) return 0; SLNode *p = head; int k = 0; while(p!=NULL && k<i) { p = p->next; k++; } cout << "The number you Locate is " << p->data << endl; return p; } SLNode *SLLMax(LinkList head) //找出具有最大值的结点位置 { if(head->next == NULL) return 0; SLNode *pMax = head->next, *p=head->next->next; while(p!=NULL) { if(p->data > pMax->data) pMax = p; p = p->next; } cout << "The largest num of the list is " << pMax->data << endl; return pMax; } int SLLNumber(LinkList head, int x) //找出有多少个定值x { int n = 0; SLNode *p = head->next; while(p != NULL) { if(p->data == x) n++; p = p ->next; } return n; } int Create(LinkList &head, int a[], int n) //建立单链表 { //逆位序输入n个元素的值,建立带表头结点的单链线性表L head=(LinkList)malloc(sizeof(SLNode)); head->next = NULL; //先建立一个带头结点的单链表 for(int i=0;i<len;++i) { LinkList p=(LinkList)malloc(sizeof(SLNode)); p->data = a[i]; //输入元素值 p->next = head->next; //插入到表头 head->next = p; } cout << "The new list create with a[] is "; for(int i=0; i<n; i++) { cout << a[i] << '/t'; } cout << endl; return 0; } int SLLInsert(SLNode *head, int i, int x) { /*在带头结点的单链表head的第i(1<=i<=n+1,n为结点个数)个位置插入数据元素*/ SLNode *p, *q; int j; /*让指针p指向第i-1个结点*/ p = head; j = 0; while(p!=NULL && j<i-1) { p = p->next; j++; } if(j!=i-1) { cout << "插入位置参数错!" << endl; return 0; } /*生成新结点由指针q指示*/ if((q=(SLNode*)malloc(sizeof(SLNode))) == NULL) exit(1); q->data = x; q->next = p->next; p->next = q; //把新结点链入单链表中 return 1; } int SLLDelete(SLNode *head, int i, int *x) { /*删除带头结点的单链表head的第i(1<=i<=n,n为结点个数)个结点。删除结点的数据元素由x带回。删除成功时返回1;否则返回0*/ SLNode *p, *q; int j; /*让指针p指向第i-1个结点*/ p = head; j = 0; while(p->next!=NULL && j<i-1) { /*注意:这里要用条件p->next!=NULL,而不能用p!=NULL,否则当参数i不合法时,会因p->next不存在而出错*/ p = p->next; j++; } if(j!=i-1) { cout << "删除位置参数错!" << endl; return 0; } q = p->next; p->next = p->next->next; //删除指针q所指结点 *x = q->data; //把指针q所指结点的数据元素由x带回 free(q); //释放指针q所指结点的内存空间 return 1; } int SLLGet(SLNode *head, int i, int *x) { /*取结点元素,和删除函数类同,只是不删除结点i*/ SLNode *p; int j; p = head; j = 0; while(p->next!=NULL && j<i) { p = p->next; j++; } if(j!=i) { cout << "取元素位置参数错!" << endl; return 0; } *x = p->data; return 1; } int SLLNotEmpty(SLNode *head) //判断是否非空,非空返回1,空返回0 { if(head->next == NULL) return 0; else return 1; } int main() { int n, x, size; LinkList L; SLLCreate(L); SLLDisplay(L); cout << "Input the num you want to Locate: "; cin >> n; cout << "And the address of the Locate number is " << SLLLocate(L, n) << endl; cout << "And the address of the Largest number is " << SLLMax(L) << endl; cout << "Input the number you want to statistics "; cin >> x; cout << "There are " << SLLNumber(L, x) << " of the " << x << " in the list!" << endl; cout << "Input the num you want to create the length of the a[]: "; cin >> size; int *p = new int [size]; cout << "Input several numbers for the a[] to create a new list : " << endl; for(int i=0; i<size; i++) { cin >> p[i]; } cout << "The members of a[] are "; for(int i=0; i<size; i++) { cout << p[i] << '/t'; } cout << endl; Create(L, p, size); delete []p; system("pause"); }