C - 数据结构之 循环链表

来源:互联网 发布:js array contains方法 编辑:程序博客网 时间:2024/05/01 07:35
#include <stdio.h>typedef struct node{int data;struct node * next;}LinkListNode;typedef struct {LinkListNode *rear;//头指针int length; }LinkList; //创建表LinkList * createList(LinkList *);//初始化表 LinkList * initList(LinkList *); //求表长 int getLength(LinkList *);//插入 LinkList * insertList(LinkList *,int ,int );//前插LinkList * insertListAtFirst(LinkList *,int ); //按值删除 LinkList * deleteListByValue(LinkList *,int );//按序号删除 LinkList * deleteListByIndex(LinkList *,int );//删除头节点 LinkList * deleteFirstNode(LinkList *); //按值查找 LinkListNode * searchByValue(LinkList *,int );//按值查找的节点的前一个节点LinkListNode * searchByValue2(LinkList *,int ); //按序号查找 LinkListNode * searchByIndex(LinkList *,int ); //按序号查找2 LinkListNode * searchByIndex2(LinkList *list,int pos);//去重LinkListNode * deleteRepeatValue(LinkList *,int ); LinkListNode * deleteRepeatValue2(LinkList *,int); //创建表函数 LinkList * createList(LinkList *list){list = (LinkList *)malloc(sizeof(LinkList));printf("\n创建表成功");return list;}//初始化表函数 LinkList * initList(LinkList *list){if(list == NULL){printf("\n表未创建,请先创建再初始化!");return NULL;}list->head = NULL;list->rear = NULL;list->length = 0;printf("\n初始化表成功");return list;}//后插函数LinkList * insertListAtLast(LinkList *list,int value){LinkListNode *temp;if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}temp = (LinkListNode *)malloc(sizeof(LinkListNode));if(list->length == 0){temp->data = value;list->rear = temp;temp->next = list->rear;}else{temp->data = value;temp->next = list->rear->next;list->rear->next = temp;list->rear = temp;} list->length++;printf("\n插入成功");return list;} //随意插入函数LinkList *insertList(LinkList *list,int pos,int value){LinkListNode *temp = NULL,*p = NULL;LinkListNode *newNode;if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}if( pos < 1 || pos > list->length+1){printf("\n插入位置不正确");return list;}if(pos == list->length+1){list = insertListAtLast(list,value);return list;}temp = searchByIndex(list,pos);if(temp){newNode = (LinkListNode *)malloc(sizeof(LinkListNode));newNode->data = value;newNode->next = temp->next;temp->next = newNode;list->length++;}printf("\n插入成功"); return list;}//按序号查找LinkListNode * searchByIndex(LinkList *list,int pos){if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}if( pos < 1 || pos > list->length){printf("\n查找的位置不正确");return NULL;}int cnt = 1;LinkListNode *p;p = list->rear;while(cnt!=pos){p=p->next;cnt++;}return p;}//按序号查找2 (返回前一个节点)LinkListNode * searchByIndex2(LinkList *list,int pos){if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}if( pos < 1 || pos > list->length){printf("\n查找的位置不正确");return NULL;}int cnt = 0;LinkListNode *p;p = list->rear;while(cnt!=pos){p=p->next;cnt++;}return p;}//输出void displayList(LinkList *list){LinkListNode *p;if(list == NULL){printf("\n表不存在,请先创建并初始化");return ;}p = list->rear->next;int i = 0;while(i<list->length){printf("\t%d",p->data);p = p->next;i++;}return ;}//按值查找 LinkListNode * searchByValue(LinkList *list,int value){LinkListNode *p = NULL;if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}p = list->rear;int cnt = 0;while(cnt < list->length){if(p->data == value){return p;}else{p = p->next;cnt++;}}return NULL;}//删除链表第一个节点 LinkList * deleteFirstNode(LinkList *list){LinkListNode *p = NULL,*q = NULL;if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}q = list->rear->next;list->rear->next = q->next;free(q);list->length--;printf("\n删除成功");return list; }//按序号删除LinkList * deleteListByIndex(LinkList *list,int pos){LinkListNode *p = NULL,*q = NULL;if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}if(pos < 1 || pos > list->length){printf("\n删除位置不合法");return list; }if(pos == 1){q = list->rear->next;list->rear->next = q->next;free(q);list->length--;printf("\n删除成功");return list;}p = searchByIndex2(list,pos-1);if(p != NULL){q = p->next;p->next = q->next;free(q);list->length--; printf("\n删除成功"); }return list;}//按找值为value的节点的前一个节点 LinkListNode * searchByValue2(LinkList *list,int value){LinkListNode *p = NULL;if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}p = list->rear;int cnt = 0;while(cnt<list->length){if(p->next->data == value){return p;}else{cnt++;p = p->next;}}return NULL;}//按值删除LinkList * deleteListByValue(LinkList *list,int value){LinkListNode *p = NULL,*q = NULL;;if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}p = list->rear;if(p->next->data == value){list = deleteFirstNode(list);return list;}p = searchByValue(list,value);if(p != NULL){q = p->next;p->next = q->next;free(q);list->length--;printf("\n删除成功");return list;}return list;}//去重LinkListNode * deleteRepeatValue(LinkList *list,int value){LinkListNode *p = NULL,*q = NULL;;if(list == NULL){printf("\n表不存在,请先创建并初始化");return NULL;}p = list->rear->next;if(p->data == value){list = deleteFirstNode(list);return list;}p = searchByValue2(list,value);if(p != NULL){q = p->next;p->next = q->next;free(q);list->length--;return list;}return list;}int main(int argc, char *argv[]){LinkListNode *w = NULL;int flag = 1;int choice;int value;int pos;LinkListNode * tempNode = NULL;LinkList * list = NULL;while(1){printf("\n------链表---------\n");printf("\n------1.创建表-----\n");printf("\n------2.初始化-----\n");printf("\n------3.求表长-----\n");printf("\n------4.尾部插入-------\n");printf("\n------5.随意插入-------\n");printf("\n------6.按值删除---\n");printf("\n------7.按序号删除-\n");printf("\n------8.按值查找---\n");printf("\n------9.按序号查找-\n");printf("\n------10.输出表-----\n");printf("\n------11.去重-----\n");printf("\n------0.退出-------\n");printf("\n您的选择是:");scanf("%d",&choice);switch(choice){case 1:list = createList(list);break;case 2:list = initList(list);break;case 3:printf("表长为:%d",list->length);break;case 4:printf("\n请输入要插入的值:");scanf("%d",&value);list = insertListAtLast(list,value);break;case 5:printf("\n请输入要插入的位置:");scanf("%d",&pos);printf("\n请输入要插入的值:");scanf("%d",&value); list = insertList(list,pos,value);break;case 6:printf("\n请输入要删除的值:");scanf("%d",&value);list = deleteListByValue(list,value);break;case 7:printf("\n请输入要删除元素的位置:");scanf("%d",&pos); list = deleteListByIndex(list,pos);break;case 8:printf("\n请输入要查找的值:");scanf("%d",&value);tempNode = searchByValue(list,value);if(tempNode == NULL){printf("\n查找失败");}else{printf("\n该节点地址:%x",tempNode);printf("\n该节点的值:%d",tempNode->data);} break;case 9:printf("\n请输入要查找的位置:");scanf("%d",&pos);tempNode = searchByIndex2(list,pos);if(tempNode == NULL){printf("\n查找不成功");}else{printf("\n结点的值:%d",tempNode->data);printf("\n结点的地址:%x",tempNode);}break;case 10:displayList(list);break;case 11:printf("\n请输入要去重的值:");scanf("%d",&value);w = searchByValue(list,value);w->data = value+1;while(searchByValue(list,value) != NULL){list = deleteRepeatValue(list,value);}w->data = value;printf("\n去重成功!");break; case 0:return 0;break;default:printf("\n您的选择有误,请重新选择"); }}return 0;}

1 0
原创粉丝点击