编辑代码

#include<stdio.h>
#include "malloc.h"
#define DATATYPE2 char
typedef struct node 
{   DATATYPE2 data;
	struct node* next;
}LINKLIST;

// 1.建立单链表
//      (1)尾插入法建立单链表
LINKLIST * rcreate() 
{	LINKLIST* head, * p;
	char ch;
	head = (LINKLIST*)malloc(sizeof(LINKLIST));
	head->next =NULL;
	while ((ch = getchar()) != '\n')
	{
		p= (LINKLIST*)malloc(sizeof(LINKLIST));
		p->data = ch;
		p->next = head->next;
		head->next = p;
	}
	return(head);
}

// 1.建立单链表
//      (2)头插入法建立单链表
LINKLIST *hcreate()
{   LINKLIST *head,*p;
    char ch;
    head=(LINKLIST*)malloc(sizeof(LINKLIST));
    head->next=NULL;
    while((ch=getchar())!='\n')
    {   p=(LINKLIST*)malloc(sizeof(LINKLIST));
        p->data=ch;
        p->next=head->next;
        head->next=p;
    }
    return(head);
}

// 2.初始化操作
LINKLIST *INITITATE()
{   LINKLIST *head;
    head=(LINKLIST*)malloc(sizeof(LINKLIST));
    head->next=NULL;
    return(head);
}

// 3.求表长度的操作
int LENGTH(LINKLIST *head)
{   int i;
    LINKLIST *p;
    p=head;
    i=0;
    while(p->next!=NULL)
    {   p=p->next;
        i++;
    }
    return(i);
}

// 4.取元素操作
DATATYPE2 GET(LINKLIST *head,int i)
{   int j;
    LINKLIST *p;
    j=0;
    p=head;
    while((j<1)&&(p->next!=NULL))
    {   p=p->next;
        j=j+1;
    }
    if(j==1)
        return(p->data);
    else
        return(NULL);
}

// 5.定位操作
LINKLIST *LOCATE(LINKLIST *head,DATATYPE2 x)
{   LINKLIST *p;
    p=head->next;
    while(p!=NULL&&p->data!=x)
        p=p->next;
    return(p);
}

//6.插入操作
void INSERT(LINKLIST *head,int i,DATATYPE2 x)
{   int j;
    LINKLIST *h,*p;
    h=(LINKLIST*)malloc(sizeof(LINKLIST));
    h->data=x;
    h->next=NULL;
    p=head;
    j=0;;
    while((p->next!=NULL)&&(j<i-1))
    {   p=p->next;
        j=j+1;
    }   /*寻找位置i-1,指针p向后跟踪每个结点,同时计数器j做加1操作,直至p指向第i-1个元素或单链表结束*/
    if(j==i-1)                  /*找到位置i-1*/
    {   h->next=p->next;        
        p->next=h;
    }   /*将结点h插入到单链表的位置i-1之后,即位置i处*/
    else
        printf("insert fail")
}

// 7.删除操作
void DELETE(LINKLIST *head,int i)
{   int j;
    LINKLIST *p,*q;
    p=head;
    j=0;
    while((p->next!=NULL)&&(j<j-1))
    {   p=p->next;
        j=j+1;
    }
    if((p->next!=NULL)&&(j==i-1))
    {   q=p->next;
        p->next=q->next;
        free(q);
    }
    else
        printf("delete fail");
}

// 8.判断表空的操作
int EMPTY(LINKLIST *head)
{   if(head->next==NULL)
        return(1);
    else
        return(0);
}

// 9.单链表的输出
void print(LINKLIST *head)
{   LINKLIST *p;
    p=head->next;
    while(p!=NULL)
    {   printf("%c",p->data);
        p=p->next;
    }
}

main() 
{	LINKLIST* head, * p;
	char ch;
	printf_s("请输入:");
	head = hcreate();
	print(head);
	printf_s("\n");
	INSERT(head, 1, 'm');
	print(head);
	printf_s("\n");
	ch = GET(head, 1);
	printf_s("%c", ch);
	printf_s("\n");
	p = LOCATE(head, 'm');
	printf_s("%c", p->data);
	printf_s("\n");
	DELETE(head, 1);
	print(head);
	printf_s("\n");
	printf_s("%d", LENGTH(head));
}