最近在看数据结构的知识点,自己对数据结构的掌握不是很好,所以就把弱的地方提炼出来,以便以后查看。
#include<stdio.h> #include<stdlib.h> #define ERROR 0; #define OK 1; typedef struct Node { int data; struct Node *next; }; struct Node *LinkList; //初始化单链表 void initList() { LinkList = (struct Node *)malloc(sizeof(struct Node *)); //建立头结点 LinkList->next = NULL; //建立空的单链表L } //头插法建立单链表 void creatFromHead() { struct Node *s; char c; int flag=1; printf("头插法建立单链表,输入字符,输入$结束...\n"); while(flag) { c=getchar(); if(c != '$') { s=(struct Node *)malloc(sizeof(struct Node)); s->data = c; s->next = LinkList->next; LinkList->next = s; } else flag = 0; } } //尾插法建立单链表 void creatFromTail() { struct Node *r,*s; int flag=1; char c; printf("尾插法建立单链表,输入字符,输入$结束...\n"); r = LinkList; //r指针指向当前表尾 while(flag) { c = getchar(); if(c != '$') { s = (struct Node *)malloc(sizeof(struct Node)); s->data = c; r->next = s; r = s; } else { flag = 0; r->next = NULL; //将尾节点的next域置为空,表示链表的结束 } } } //按序号查找 void get(int i) { int j; struct Node *p; if(i<=0) { printf("输入的位置不存在!\n"); } p=LinkList; j=0; while((p->next != NULL)&&(j<i)) { p=p->next; //扫描下一个节点 j++; //已扫描节点数 } if(i==j) printf("查到的值是:%d\n",p->data); //找到了第i个结点 else printf("没找到!\n"); } //按值查找 struct Node *Locate(int e_data) { struct Node *p; printf("输入要查找的数据!\n"); p=LinkList->next; //从表中第一个结点开始 while(p != NULL) { if(p->data != e_data) p = p->next; else break; //找到结点值是e_data时推出循环 } return p; } //插入操作 int insert(int i,int e_data) { struct Node *pre,*s; int j=0; printf("输入要插入的数字和位置!\n"); pre=LinkList; //从头开始,查找第i-1个结点 if(i<1) return ERROR; while((pre != NULL) && (j<i-1)) //表没有查完,并且没有查到i-1处时,重复 { pre = pre->next; j++; } if(!pre) //当前位置pre为空,表示已找完还未数到第i个,说明插入位置不合理 { printf("插入位置不合法\n"); return ERROR; } s = (struct Node *)malloc(sizeof(struct Node)); //申请一个新节点s s->data = e_data; pre->next = s->next; pre->next = s; return OK; } // 删除操作 int delList(int i,int *e_data) { struct Node *pre,*r; int k = 0; printf("输入要删除的数字的位置,以及数字!\n"); pre=LinkList; while((pre->next !=NULL) && (k<i-1)) { pre = pre->next; k++; } if(!(pre -> next)) //pre->next为空,说明删除的节点位置i不合法 { printf("删除位置不合法\n"); return ERROR; } r = pre->next; pre->next = pre->next->next; *e_data = r->data; free(r); //释放被删除结点所占的内存空间 return OK; } int main() { int i=0; int offset; struct Node *p; p = (struct Node *)malloc(sizeof(struct Node)); initList(); creatFromHead(); printf("头插法创建成功!\n"); //按序号查找 printf("输入要查找数据的序号!\n"); scanf("%d",&offset); get(offset); return 0; }