数据结构考研复习(单链表)
复习资料上有部分内容存在问题,我自己改写了一些细枝末节的东西,整理后最终代码如下:
#include<stdio.h> #include<malloc.h> typedef struct LNode{ int data; struct LNode *next; }LNode, *LinkList; /* -1- 头插法建立单链表*/ LinkList List_HeadInsert(LinkList &L){ LNode *temp;//中间结点 int x; L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; while(x!=9999){ scanf("%d",&x); temp = (LNode*)malloc(sizeof(LNode)); temp-> data = x; temp->next = L->next; L->next = temp; } return L; } /* -2- 尾插法建立单链表*/ LinkList List_TailInsert(LinkList &L){ int x; L = (LinkList)malloc(sizeof(LNode)); LNode *temp, *t = L;//t为表尾指针 while(x!=9999){ temp = (LNode*)malloc(sizeof(LNode)); temp->data = x; t->next = temp; t = temp; scanf("%d",&x); } t->next = NULL;//尾结点指针置空 return L; } /* -3- 获取单链表中的元素*/ int Get_Element(LinkList &L){ LNode *temp = L->next; while(temp->next){ temp = temp->next; printf("%d ",temp->data); } printf("\n"); } /* -4- 按序号查找结点值*/ LNode *Find_Element(LinkList L,int i){ int j = 1;//计数 LNode *temp = L->next;//头结点指针赋给temp if(i==0) { return L;//返回头结点 } if(i<0) { printf("访问位置不合法!"); } else{ while(temp && j < i+1){ temp = temp->next; j++; } return temp; } } /* -5- 按值查找表结点*/ int Locate_Element(LinkList L,int i){ LNode *temp = L->next; int m = 0; while(temp && temp->data != i){ temp = temp->next; m++; } return m; } /* -6- 插入结点(后插)*/ LNode *Insert_Element1(LinkList L,int i,int e){ LNode *previous = L->next; int m = 0; while(previous && m<i){ previous = previous->next; m++; } LNode *temp = (LinkList)malloc(sizeof(LNode)); temp->data = e; temp->next = previous->next; previous->next = temp; return L; } /* -7- 插入结点(前插)*/ LNode *Insert_Element2(LinkList L,int i,int e){ i--; Insert_Element1(L,i,e); return L; } /* -8- 删除结点*/ LNode *Delete_Element(LinkList L,int i){ LNode *previous = L->next; int m = 1; while(previous && m<i){ previous = previous->next; m++; } LNode *del_elem = previous->next; previous->next = previous->next->next; free(del_elem); return L; } /* -9- 求单链表长度*/ int length_list(LinkList L){ LNode *temp = L->next; int m = 0; while(temp){ temp = temp->next; m++; } return m; } int main(){ LinkList L; printf("\t请对单链表建立方式进行选择:\n"); printf("\t==1.头插法\n"); printf("\t==2.尾插法\n"); int flag; scanf("%d",&flag); switch(flag) { case(1): { printf("\t请依次输入数据:\n\t"); printf("====================\n"); List_HeadInsert(L); Get_Element(L); break; } case(2): { printf("\t请依次输入数据:\n\t"); printf("====================\n"); List_TailInsert(L); Get_Element(L); break; } } printf("\t*****请进行选择:\n"); printf("\t==1.按序号查找结点值==\n"); printf("\t==2.按值查找表结点==\n"); printf("\t==3.在指定序列 后 插入元素==\n"); printf("\t==4.在指定序列 前 插入元素==\n"); printf("\t==5.删除指定序列的元素==\n"); printf("\t==6.求单链表元素个数==\n"); int selection; scanf("%d",&selection); switch(selection) { case(1): { printf("\t请输入要查询的序号:\n"); int m; scanf("%d",&m); LNode *temp = Find_Element(L,m); printf("在单链表中第 %d 个结点的值为 %d ",m,temp->data); break; } case(2): { printf("\t请输入要查找的结点:\n"); int m; scanf("%d",&m); int temp = Locate_Element(L,m); printf("值为 %d 的结点所在的位置是单链表的第 %d 个",m,temp); break; } case(3): { printf("\t请输入要插入元素的序列:\n"); int m; scanf("%d",&m); printf("\t请输入要插入的元素值:\n"); int e; scanf("%d",&e); Insert_Element1(L,m,e); Get_Element(L); break; } case(4): { printf("\t请输入要插入元素的序列:\n"); int m; scanf("%d",&m); printf("\t请输入要插入的元素值:\n"); int e; scanf("%d",&e); Insert_Element2(L,m,e); Get_Element(L); break; } case(5): { printf("\t请输入要删除的元素序列:\n"); int m; scanf("%d",&m); Delete_Element(L,m); Get_Element(L); break; } case(6): { int length = length_list(L); printf("单链表中元素个数为【%d】",length-1); } } return 0; }
运行结果: