#include <iostream> #define OVERFLOW -1 #define OK 1 #define ERROR 0 typedef int Status; using namespace std; /* 定义链表节点 */ typedef struct Node { int data; struct Node *next; }Node, *LinkList; /* 初始化链表,即安排一个头结点 */ Status init(LinkList &l) { l = (LinkList)malloc(sizeof(Node)); if(!l)exit(OVERFLOW); l ->next = NULL; return OK; } /* 添加一个节点在头部后面 */ Status addNode(LinkList &l, int data) { if(l == NULL)init(l); Node *n = NULL; init(n); n ->data = data; n ->next = l ->next; l ->next = n; printf("%s/n", "节点添加成功!"); return OK; } /* 得到链表的长度 */ int getLength(LinkList &l) { int length = 0; if(l == NULL || l ->next == NULL)return length; Node *n = l ->next; while(n != NULL) { ++length; n = n ->next; } return length; } /* 在链表的某个位置插入一个元素,前提是链表中已经有节点 */ Status insertNode(LinkList &l, int position, int data) { int length = getLength(l); if(position < 1 || position > length) { printf("%s/n", "保证链表存在结点才可以插入!"); return ERROR; } int curPosition = 0; Node *n= l; while(n != NULL && curPosition < position - 1) { n = n ->next; ++curPosition; } // 此时的n正好是即将插入的位置的之前节点 Node *insertNode = (Node*)malloc(sizeof(Node)); if(!insertNode)exit(OVERFLOW); insertNode ->data = data; insertNode ->next = n ->next; n ->next = insertNode; printf("%s/n", "插入成功!"); return OK; } /* 从链表上删除某位置的节点,并且用data返回对应节点的数据 */ Status deleteNode(LinkList &l, int position, int &data) { int length = getLength(l); if(position < 1 || position > length) { printf("%s/n", "保证链表存在结点才可以删除!"); return ERROR; } int curPosition = 0; Node *n= l; while(n != NULL && curPosition < position - 1) { n = n ->next; ++curPosition; } // 此时的n正好是即将删除的位置的之前节点 Node *deleNode = n ->next; n ->next = n ->next ->next; data = deleNode ->data; free(deleNode); printf("%s%d/n", "删除成功,删除节点的数据为:", data); return OK; } /* 打印链表 */ void print(LinkList &l) { if(l == NULL) { printf("%s/n", "链表还没有初始化!"); return; } if( l ->next == NULL) { printf("%s/n", "链表只有头结点!"); return; } Node *n = l ->next; while(n != NULL) { printf("%d -> ", n ->data); n = n ->next; } printf("%s/n", ""); } /* 主函数,操作 */ void main() { LinkList list = NULL; int r = -1; while(r != 0) { printf("%s/n", "1:初始化链表"); printf("%s/n", "2:在头部后面添加一个节点"); printf("%s/n", "3:打印链表"); printf("%s/n", "4:在位置i添加节点"); printf("%s/n", "5:删除位置i上的节点"); scanf("%d", &r); switch(r) { case 1: init(list); printf("%s/n", "初始化完毕!"); break; case 2: int data; printf("%s", "请输入节点数据:"); scanf("%d", &data); addNode(list, data); break; case 3: print(list); break; case 4: int position; printf("%s", "请输入位置和数据(空格隔开):"); scanf("%d%d", &position, &data); insertNode(list, position, data); break; case 5: int delPosition; printf("%s", "请输入位置:"); scanf("%d", &delPosition); deleteNode(list, delPosition, data); break; } } }