具体题目如下:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>//单链表的定义:
typedef int DataType; //DataType可以是任何相应的数据类型如int, float或chartypedef struct node //结点类型定义
{ DataType data; //结点的数据域struct node *next; //结点的指针域
}ListNode;typedef ListNode *LinkList;int main()
{int i;DataType key,x;LinkList head=NULL;LinkList CreateList();void PrintList(LinkList head);void LocateNode(LinkList head,DataType key);void InsertList(LinkList head,DataType x,int i);void DeleteList(LinkList head,int i);void ChangeCircList(LinkList head);void PrintCircList(LinkList head);char choice;while (1){system("cls");printf("\n\n\n\n");printf("\t\t 链表操作 \n");printf("\t\t======================================");printf("\n\n");printf("\t\t 1:建立单链表 \n");printf("\t\t 2:显示单链表 \n");printf("\t\t 3:查找 \n");printf("\t\t 4:插入 \n");printf("\t\t 5:删除 \n");printf("\t\t 6:改为循环单链表并显示 \n");printf("\n");printf("\t\t 0:退出 \n");printf("\n");printf("\t\t请选择:");choice = getch();system("cls");switch(choice){case '1':head=CreateList();printf("链表创建成功!\n");getch();break;case '2':PrintList(head);getch();break;case '3':printf("输入要查找的值:");scanf("%d",&key);LocateNode(head,key); //单链表查找getch();break;case '4': printf("请输入欲插入元素的位置:");scanf("%d",&i); printf("请输入欲插入的元素:");scanf("%d",&x);InsertList(head,x,i); //单链表插入getch();break;case '5':printf("请输入欲删除结点的位置:");scanf("%d",&i);DeleteList(head,i); //单链表删除break; case '6':ChangeCircList(head); //修改为循环单链表PrintCircList(head); //打印循环单链表getch();break;case '0':exit(0);}}
}//单链表的建立:
LinkList CreateList()
{//在此插入必要的语句return head;
}//单链表的打印:
void PrintList(LinkList head)
{//在此插入必要的语句
}//单链表的查找:
void LocateNode(LinkList head,DataType key)
{//在此插入必要的语句
}//单链表的插入:
void InsertList(LinkList head,DataType x,int i)
{ //在此插入必要的语句
}//单链表的删除:
void DeleteList(LinkList head,int i)
{//在此插入必要的语句
}//修改为循环单链表:
void ChangeCircList(LinkList head)
{//在此插入必要的语句
}//循环单链表的打印:
void PrintCircList(LinkList head)
{//在此插入必要的语句
}
需要完成的代码如下:
- 从键盘输入10个整数,产生带表头的单链表,并输入结点值。
- 从键盘输入1个整数,在单链表中查找该结点。若找到,则显示“找到了”;否则,则显示“找不到”。
- 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。
- 从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
- 把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。
1.单链表的建立与打印
//单链表的建立:
LinkList CreateList()
{//输入10个数int arr[10];int i=0;for(i=0;i<=9;i++){scanf("%d",&arr[i]);} //创建结点LinkList node1 = (LinkList)malloc(sizeof(ListNode));node1->data=arr[0];LinkList node2 = (LinkList)malloc(sizeof(ListNode));node2->data=arr[1];LinkList node3 = (LinkList)malloc(sizeof(ListNode));node3->data=arr[2];LinkList node4 = (LinkList)malloc(sizeof(ListNode));node4->data=arr[3];LinkList node5 = (LinkList)malloc(sizeof(ListNode));node5->data=arr[4];LinkList node6 = (LinkList)malloc(sizeof(ListNode));node6->data=arr[5];LinkList node7 = (LinkList)malloc(sizeof(ListNode));node7->data=arr[6];LinkList node8 = (LinkList)malloc(sizeof(ListNode));node8->data=arr[7];LinkList node9 = (LinkList)malloc(sizeof(ListNode));node9->data=arr[8];LinkList node10 = (LinkList)malloc(sizeof(ListNode));node10->data=arr[9];//链接10个结点 node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5; node5->next = node6;node6->next = node7;node7->next = node8;node8->next = node9;node9->next = node10;node10->next = NULL;LinkList head = node1; //让头指针指向第二个结点 return head;
}//单链表的打印:
void PrintList(LinkList head)
{LinkList pcur = head; //让head指针依旧指向原结点 while (pcur) //pcur != NULL{printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}
2.单链表的查找
LinkList pcur = head;int count=0,flag=0;while(pcur){count++;if(pcur->data==key){flag=1;printf("找到了!在第%d个结点",count);}pcur=pcur->next;}if(flag==0){printf("没找到"); }
3.单链表的插入
void InsertList(LinkList head,DataType x,int i)
{ int j=0;LinkList current = head;//从头遍历 while(current->next!=NULL){j++;//计数,若j=i-1,循环退出if (j==i-1){break;} current = current->next;}LinkList p = (LinkList) malloc (sizeof (ListNode));//建立新结点p->data = x;p->next = current->next;current->next = p;
}
4.单链表的删除
void DeleteList(LinkList head,int i)
{int j=0;LinkList current = head;//从头遍历 while(current->next!=NULL){j++;//计数,若j=i-1,循环退出if (j==i-1){break;} current = current->next;}current->next = current->next->next;
}
5.循环单链表的修改与表示
//修改为循环单链表:
void ChangeCircList(LinkList head)
{LinkList current = head;int j=0; while(current->next!=NULL)//当current下一个非空 {current = current->next;if (current->next==NULL)//如果current下一个为空,说明current到尾部 {current->next = head;break;}}
}//循环单链表的打印:
void PrintCircList(LinkList head)
{int j,n;n=10;LinkList current = head;for(j=0;j<n;j++){printf("%d ",current->data);current=current->next;}
}
6.全部代码
全部代码是由我和我室友共同思考得出,快和我一起大声说:“谢谢室友!”
//单链表的建立:
LinkList CreateList()
{//输入10个数int arr[10];int i=0;for(i=0;i<=9;i++){scanf("%d",&arr[i]);} //创建结点LinkList node1 = (LinkList)malloc(sizeof(ListNode));node1->data=arr[0];LinkList node2 = (LinkList)malloc(sizeof(ListNode));node2->data=arr[1];LinkList node3 = (LinkList)malloc(sizeof(ListNode));node3->data=arr[2];LinkList node4 = (LinkList)malloc(sizeof(ListNode));node4->data=arr[3];LinkList node5 = (LinkList)malloc(sizeof(ListNode));node5->data=arr[4];LinkList node6 = (LinkList)malloc(sizeof(ListNode));node6->data=arr[5];LinkList node7 = (LinkList)malloc(sizeof(ListNode));node7->data=arr[6];LinkList node8 = (LinkList)malloc(sizeof(ListNode));node8->data=arr[7];LinkList node9 = (LinkList)malloc(sizeof(ListNode));node9->data=arr[8];LinkList node10 = (LinkList)malloc(sizeof(ListNode));node10->data=arr[9];//链接10个结点 node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5; node5->next = node6;node6->next = node7;node7->next = node8;node8->next = node9;node9->next = node10;node10->next = NULL;LinkList head = node1; //让头指针指向第二个结点 return head;//在此插入必要语句
}//单链表的打印:
void PrintList(LinkList head)
{LinkList pcur = head; //让head指针依旧指向原结点 while (pcur) //pcur != NULL{printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");//在此插入必要语句
}//单链表的查找:
void LocateNode(LinkList head,DataType key)
{LinkList pcur = head;int count=0,flag=0;while(pcur){count++;if(pcur->data==key){flag=1;printf("找到了!在第%d个结点",count);}pcur=pcur->next;}if(flag==0){printf("没找到"); }//在此插入必要语句
}//单链表的插入:
void InsertList(LinkList head,DataType x,int i)
{ int j=0;LinkList current = head;//从头遍历 while(current->next!=NULL){j++;//计数,若j=i-1,循环退出if (j==i-1){break;} current = current->next;}LinkList p = (LinkList) malloc (sizeof (ListNode));//建立新结点p->data = x;p->next = current->next;current->next = p;//在此插入必要的语句
}//单链表的删除:
void DeleteList(LinkList head,int i)
{int j=0;LinkList current = head;//从头遍历 while(current->next!=NULL){j++;//计数,若j=i-1,循环退出if (j==i-1){break;} current = current->next;}current->next = current->next->next;//在此插入必要的语句
}//修改为循环单链表:
void ChangeCircList(LinkList head)
{LinkList current = head;int j=0; while(current->next!=NULL)//当current下一个非空 {current = current->next;if (current->next==NULL)//如果current下一个为空,说明current到尾部 {current->next = head;break;}}//在此插入必要的语句
}//循环单链表的打印:
void PrintCircList(LinkList head)
{int j,n;n=10;LinkList current = head;for(j=0;j<n;j++){printf("%d ",current->data);current=current->next;}//在此插入必要的语句
}