注意头插法和尾插法区别;
头指针指向链表中第一个结点(头结点也是第一个结点);
#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> typedef struct Mnode { int data; struct Mnode *next; }Node, *Linklist; void CreatListHead(Linklist &L, int n) // 头插法; Linklist &L { int m; L = (Linklist)malloc(sizeof(Mnode)); L->next = NULL; for(int i = 0; i < n; i++) { Linklist p; scanf("%d", &m); p = (Linklist)malloc(sizeof(Mnode)); p->data = m; p->next = L->next; L->next = p; } } void PrintfList(Linklist &Q) { Linklist p = Q; p = p->next; //指向第一个结点; while(p) { printf("%d ", p->data); p = p->next; } } void CreatListTail(Linklist &L, int n) //尾插法 { Linklist r, p; L = (Linklist)malloc(sizeof(Mnode)); r = L; //醉醉的; for(int i = 0; i < n; i++) { int m; p = (Node *)malloc(sizeof(Mnode)); scanf("%d", &m); p->data = m; r->next = p; r = p; } r->next = NULL; } bool ListInsert(Linklist &L, int pos, int n) //在位置pos处插入一个元素n; { Linklist q, p, Q; int j = 1; p = L; while(p->next && j < pos) { ++j; p = p->next; } if(!(p->next) || j > pos) return false; q = (Linklist)malloc(sizeof(Mnode)); q->data = n; q->next = p->next; p->next = q; return true; } bool GetElem(Linklist &L, int pos, int *e) { int j = 1; Linklist p; p = L; while(p->next && j < pos) { ++j; p = p->next; } if(!(p->next) || j > pos) return false; else printf("%d\n", p->next->data); return true; } bool ListDelete(Linklist &L, int pos, int *e) //删除链表中第pos个元素; { int j = 1; Linklist p, q; p = L; while(j < pos && p->next) //j==i时其实刚好判断完目标结点的前一个节点; { ++j; p = p->next; } if(!(p->next) || j > pos) return false; q = p->next; e = &(q->data); //p->next = p->next->next; p->next = q->next; return true; } void ClearList(Linklist &L) //清空链表; { Linklist q, p; p = L->next; while(p) { q = p->next; free(p); p = q; } L->next = NULL; } void UnionList(Linklist &L, Linklist &M) { Linklist p, q; p = L->next; while(p) { p = p->next; } q = M->next; p->next = q; // free[M]; } Linklist Q; int posi; void Operator() { int m, n; scanf("%d", &n); switch(n) { case 1: printf("创建单链表(头插法):\n"); scanf("%d", &m); CreatListHead(Q, m); break; case 2: printf("创建单链表Q(尾插法):\n"); int d; scanf("%d", &d); CreatListTail(Q, d); break; case 3: printf("查找元素是否存在\n"); int *b; scanf("%d", &posi); GetElem(Q, posi, b); break; case 4: printf("插入元素\n"); int K; scanf("%d%d", &posi, &K); ListInsert(Q, posi, K); break; case 5: printf("删除元素\n"); int *e; scanf("%d", &posi); ListDelete(Q, posi, e); PrintfList(Q); break; case 6: printf("输出链表元素\n"); PrintfList(Q); break; case 7: printf("合并链表"); // UnionList(p, Q); break; case 8: printf("清空链表\n"); ClearList(Q); break; } Operator(); } int main() { Operator(); return 0; }
浙公网安备 33010602011771号