数据结构之单链表
简单实现单链表操作!
#include <iostream> #include <malloc.h> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct Lnode { int data; struct Lnode *next; }Lnode, *Linklist; //初始化单链表 int Initlinklist(Linklist &L) { L = (Linklist)malloc(sizeof(Lnode)); if(!L) return 0; L->next=NULL; return 1; } // 求表长 int Listlength(Linklist L) { Lnode *p = L; int i=0; while(p->next) { p = p->next; i++; } return i; } // 取表元素 int GetElem(Linklist L, int i, int &e) { Lnode *p=L; int count=0; while(count<i&&p->next) { p=p->next; count++; } if(i == count) { e=p->data; return 1; } return 0; } // 查找 Linklist FindElem(Linklist L, int e) { Lnode *p=L->next; while(p&&!(p->data == e)) p = p->next; if(p) return p; return NULL; } //插入 int ListInsert(Linklist &L, int i, int e) { Lnode *p=L; Lnode *q; int j=0; while(j<i-1&&p->next){ p=p->next; j++; } if(j == i-1) { q = (Lnode *)malloc(sizeof(Lnode)); if(!q) return 0; q->data=e; q->next=p->next; p->next=q; return 1; } return 0; } // 删除 int DeleteList(Linklist &L, int i, int &e) { Lnode *p=L; Lnode *q; int j=0; while(j<i-1&&p->next) { p=p->next; j++; } if(j == i-1&&p->next){ q=p->next; p->next=q->next; e=q->data; free(q); return 1; } return 0; } // 头建表 void CreaList1(Linklist &L, int n) { Lnode *p; int i; L=(Lnode*)malloc(sizeof(Lnode)); L->next = NULL; for(i = 0; i<n ;i++) { p = (Lnode*)malloc(sizeof(Lnode)); scanf("%d", &p->data); p->next=L->next; L->next=p; } } // 尾建表 void CreaList12(Linklist &L, int n) { Lnode *r, *p; int i; L = (Lnode *)malloc(sizeof(Lnode)); r=L; for(i=0; i<n; i++) { p = (Lnode*)malloc(sizeof(Lnode)); scanf("%d", &p->data); r->next = p; r = p; } r->next=NULL; } // 输出 void printLinklist(Linklist &L) { Lnode *p=L->next; while(p) { printf("%d ", p->data); p=p->next; } printf("\n"); } // test int main() { Lnode *L1; int n, e, i, flag; Initlinklist(L1); printf("输入表规模:\n"); scanf("%d", &n); CreaList1(L1, n); printLinklist(L1); // scanf("%d", &n); // CreaList12(L2, n); // printLinklist(L2); printf("表长:%d\n", Listlength(L1)); printf("获取第几号数值:\n"); scanf("%d", &i); if(!GetElem(L1, i, e)) printf("出错!\n"); else printf("第%d号数值为:%d\n", i, e); printf("输入查找节点:\n"); scanf("%d", &e); Lnode *TNode = FindElem(L1, e); if(!TNode) printf("没找到!\n"); else printf("节点数据为:%d\n", TNode->data); printf("插入元素位置,数值:\n"); scanf("%d%d", &i, &e); flag = ListInsert(L1, i, e); if(!flag) printf("出错!\n"); else printf("插入成功!\n"); printf("表长:%d\n", Listlength(L1)); printLinklist(L1); printf("输入删除位置:\n"); scanf("%d", &i); flag=DeleteList(L1, i, e); if(!flag) printf("出错!\n"); else printf("删除位置%d数值%d成功!\n", i, e); printf("表长:%d\n", Listlength(L1)); printLinklist(L1); return 0; }