链表实验报告————————————————————————————————作者: ————————————————————————————————日期:《数据结构》实验报告二系别:嵌入式系统工程系班级:嵌入式11003班学号:11160400314姓名:孙立阔日期:2012年4月9日指导教师:申华一、上机实验的问题和要求:单链表的查找、插入与删除。
设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。
具体实现要求:1.从键盘输入10个字符,产生不带表头的单链表,并输入结点值。
2.从键盘输入1个字符,在单链表中查找该结点的位置。
若找到,则显示“找到了”;否则,则显示“找不到”。
3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。
4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。
6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。
7.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。
二、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)创建一个空的单链表,实现对单链表的查找,插入,删除的功能。
三、源程序及注释:#defineOK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define TRUE 1#define FALSE 0#define List_Init_Size10#defineListIncrement 2typedef char ET;typedef ET *Ep;typedefint Status;typedefstruct LNode{ﻩETdata;struct LNode *next;}LNode, *LinkList;/*LinkListLa,Lb,Lc;*/ﻺ#include"stdio.h"#include"alloc.h"/*Display thelinklist's elements. */void printlk(LinkList L) {LinkList p;p=L->next;while (p){printf("%c ->",p->data);p=p->next;}printf("NULL\n");}/*Creat linklist from head node. */void CreatList(LinkList*L,intn){int i;LinkListp,q;ETstr[20],c;p=(LinkList)malloc(sizeof(LNode));p->next=NULL;*L = q = p;printf("Please input thedata: ");for(i=n;i>0;i--) {p=(LinkList)malloc(sizeof(LNode));c = getche();/*scanf("%c",&c);*/printf("\n\n");p->data = c;p->next = q->next;q->next = p;}}/*Initthelinklist. */void Init(LinkList *L) {int n;printf("Please inputthe number of the node : "); scanf("%d",&n);CreatList(L,n);}/* Get the valueofelement I; */int GetElem(LinkList L,int i,ET *e) {intj=1;LinkList p;p=L->next;while(p&&j<i) {p=p->next;++j;}if(!p||j>i)return TRUE;*e=p->data;return FALSE;}/*Insert a element after I*/int ListInsert(LinkList*L,inti,ET e) {/*Add your owncodes.*/}/*Deletethe element I*/int ListDelete(LinkList *L,int i,ET*e){/* Addyour own codes. */}intInsert(LinkList *L){int i,flag;ET data;printf("Please inputtheposition : ");scanf("%d",&i);printf("Please input thedata : ");data =getche();/*scanf("%c",&data);*/flag= ListInsert(L,i,data);return flag;}Status Delete(LinkList*L){inti,flag;ET e;printf("Pleaseinput the number:");scanf("%d",&i);flag =ListDelete(L,i,&e);printf("Deletedelementis%c\n",e);returnflag;}/*Find the element'sposition.*/intLocateElem(LinkList L,ETe) {int i=0;LinkList p;p =L->next;while (p) {i++;if(p->data== e)returni;}return 0;}/*Addthe Lb afterthe La.*/void Union( LinkList *La ,LinkList*Lb){LinkListpa,pb;/*Add yourowncodes. */}/*Merge two sequence into one,don't change anyelements inthese twolink lists. Jointwosequence to one. */void MergeList(LinkList*L1,LinkList *L2,LinkList*L3) {LinkList pa,pb,pc;/*Addyour own codes. */}/*List the Menu*/voidMenuList(){printf("\n\n\n==========================\n");printf(" 1*******Insert LA\n");printf(" 2******* Insert LB\n");printf("3******* Delete LA\n");printf(" 4 ******* Delete LB\n");printf(" 5 ******* Union LA and LB\n");printf(" 6 *******MergeLAand LB to LC\n"); printf(" 7 *******printLinkList\n");printf(" 8 *******Exit\n");printf("==========================\n"); }/*Selectthemenu*/voidMenuSelect(LinkList *La,LinkList *Lb){ intselect,done=1;LinkList Lc;while (done) {MenuList();printf("input theoperating code : ");scanf("%d",&select);switch(select){case1:Insert(La);break;ﻩ case 2:Insert(Lb);break;ﻩ case3:Delete(La);break;ﻩ case 4: Delete(Lb);break;ﻩ case5: Union(La,Lb);break;ﻩ case6: MergeList(La,Lb,&Lc);ﻩﻩprintf("LC: ");printlk(Lc);ﻩbreak;case 7:printf("LA: ");printlk(*La);ﻩ printf("LB: ");printlk(*Lb);break;case8: done=0;break;ﻩdefault: printf("ERROR\n");}}}main( ){LinkList La,Lb;printf("LA");Init(&La) ;printlk(La);printf("LB");Init(&Lb) ;printlk(Lb);MenuSelect(&La,&Lb);}调试后的代码:#include<stdio.h>#include<malloc.h>typedef int DataType;typedef struct LinkList{int data;struct LinkList *next;}LinkList;void PrintList(LinkList *h);LinkList* InitList();void InsList(LinkList *h,int i,DataType x); void LocList(LinkList *h,int i);void DelList(LinkList *h,inti);void main(){int i,n,x;LinkList *h;ﻩh=InitList();PrintList(h);printf("\n===========\n");printf("0------EXIT\n");ﻩprintf("1------INSERT\n");ﻩprintf("2------DELERT\n");ﻩprintf("3------LOCERT\n");printf("\n===========\n\n\n");ﻩwhile(1)ﻩ{ﻩprintf("\nSelect\n");ﻩscanf("%d",&n);switch(n)ﻩ{ﻩcase 0:ﻩﻩﻩexit(0);ﻩbreak;ﻩﻩcase 1:ﻩprintf("please inputthe position:\n");ﻩscanf("%d",&n);ﻩﻩﻩprintf("please inputthe data:\n");ﻩscanf("%d",&x);InsList(h,n,x);ﻩPrintList(h);break;ﻩcase 2:printf("please input you wantto delete position:\n");ﻩﻩﻩscanf("%d",&i);ﻩﻩDelList(h,i);ﻩﻩPrintList(h);ﻩbreak;ﻩcase 3:ﻩﻩprintf("please input you want to search position:\n");ﻩscanf("%d",&i);ﻩﻩLocList(h,i);ﻩPrintList(h);ﻩﻩbreak;default :ﻩprintf("error\n");ﻩbreak;ﻩ}}ﻩ}LinkList* InitList(){ﻩ LinkList *h,*s,*r;ﻩ int a,c,i;ﻩ h=(LinkList*)malloc(sizeof(LinkList));ﻩh->next=NULL;r=h;ﻩ printf("please input some link's length:");ﻩscanf("%d",&c);ﻩ for(i=0;i<c;i++){scanf("%d",&a);ﻩ s=(LinkList*)malloc(sizeof(LinkList)); ﻩ s->data=a;ﻩﻩs->next=r->next;ﻩr->next=s;ﻩﻩ r=r->next;}ﻩreturn h;}void InsList(LinkList *h,int i,DataType x){LinkList *s,*p;ﻩint j=1;ﻩp=h;s=(LinkList*)malloc(sizeof(LinkList)); ﻩfor(j=1;j<i &&p!=NULL;j++)p=p->next;ﻩif(p==NULL)printf("error!\n");ﻩelse{ﻩs->data=x;ﻩs->next=p->next;p->next=s;ﻩﻩ}}void DelList(LinkList *h,int i){LinkList *p,*q;ﻩint j=1;p=h->next;ﻩq=p->next;while(j!=i-1 && q!=NULL)ﻩ{ﻩp=p->next;ﻩq=q->next;ﻩﻩj++;ﻩ}if(q==NULL)printf("error!\n");elseﻩ{p->next=q->next;ﻩﻩfree(q);}}void LocList(LinkList*h,int i){LinkList *p;intj=1;p=h->next;ﻩwhile(p!=NULL){ﻩif(p->data==i)ﻩ{ﻩprintf("position is%d\n",j);ﻩbreak;ﻩ}ﻩp=p->next;ﻩﻩj++;}if(p==NULL)ﻩprintf("NO this data inthe link\n"); }void PrintList(LinkList*h){LinkList *p;p=h->next;ﻩwhile(p!=NULL)ﻩ{ﻩprintf(" %d->",p->data);p=p->next;ﻩ}}四、运行输出结果:五、调试和运行程序过程中产生的问题及采取的措施:问题:子函数和主函数前后的调用出现问题,指针的调用不是太明白。