#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node
{char data;
struct Node* next;
}linklist;
linklist *head,*p;
linklist *CREATLISTRO()//尾插法建立单链表
{
char ch;
linklist *head,*s,r;
head=NULL;
r=NULL;
printf("开始建立单链表输入$结束\n");
ch=getchar();
while(ch!='$')
{
s=(linklist)malloc(sizeof(linklist));
s->data=ch;
if(head==NULL)
head=s;
else
r->next=s;
r=s;
ch=getchar();
}
if(r!=NULL)
r->next=NULL;
return head;
}
///
//输出单链表/1
void ShowList(linklist *head)
{
linklist *p;
printf("输出单链表:"); p=head;
if(head->next==NULL)
printf("表为空\n");
else
while(p!=NULL)
{
printf(" %c ",p->data);
p=p->next;
}
printf("\n");
}
//求单链表长度//
void LENGTH(linklist *head)
//求长度
{
int n=0;
linklist p;
p=head;
if(head->next==NULL)
printf("表为空\n");
else
while(p->next!=NULL)
{
n++;
p=p->next;
}
printf("\n该单链表的长度为:%d\n",n+1);
}
linklist GET(linklist *head,int i)//按位查找
{
int j;
linklist p;
p=head;
j=0;
while((p->next!=NULL)&&(j<i))
{
p=p->next;
j++;
}
if(i==j)
return p;
else
return NULL;
}
linklist LOCATE(linklist *head,int key)//按值查找
{
linklist p;
p=head->next;
while(p!=NULL)
if(p->data!=key)
p=p->next;
else break;
return p;
}
linklist INSERTBEFORE(linklist *head)//前插
{
linklist *s,q;
int i;
char x;
printf("\n请输入插入的结点:");
scanf("%c",&x);
getchar();
printf("请输入插入的位置:");
scanf("%d",&i);
getchar();
p=GET(head,i-1);
s=(linklist)malloc(sizeof(linklist));
s->data=x;
q=head;
while(q->next!=p)
q=q->next;
s->next=p;
q->next=s;
printf("插入成功!\n");
return head;
}
void DELETE(linklist *head,int i)
{
linklist *p,*r;
int j;
j=i-1;
p=GET(head,j);
if((p!=NULL)&&(p->next!=NULL))
{
r=p->next;
p->next=r->next;
free(r);
printf("删除成功!\n");
}
else
printf("error!");
}
int main()
{
int j=1,g=1,h=1;
int i=1;
int n,key;
head=CREATLISTRO();
ShowList(head);
printf("请输入须查找结点:");
scanf("%c",&key);
getchar();
printf("%c结点储存的位置为:%d\n",key,LOCATE(head,key));
getchar();
LENGTH(head);
INSERTBEFORE(head);
ShowList(head);
printf("请输入删除的结点:\n");
scanf("%d",&i);
DELETE(head,i);
ShowList(head);
return 0;
}
修改完善如下,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node
{
char data;
struct Node* next;
}linklist;
//linklist* head,* p;
linklist* CREATLISTRO()//尾插法建立单链表
{
char ch;
linklist* head, * s, *r;
head = NULL;
r = NULL;
printf("开始建立单链表输入$结束\n");
scanf(" %c", &ch);
while (ch != '$')
{
getchar(); //修改
s = (linklist*)malloc(sizeof(linklist));
s->data = ch;
if (head == NULL)
head = s;
else
r->next = s;
r = s;
scanf(" %c", &ch);
}
r->next = NULL;
return head;
}
//输出单链表/1
void ShowList(linklist* head)
{
linklist* p;
p = head;
printf("输出单链表:");
if (head == NULL) //if (head->next == NULL)
printf("表为空\n");
else
while (p != NULL)
{
printf(" %c ", p->data);
p = p->next;
}
printf("\n");
}
//求单链表长度//
void LENGTH(linklist* head)
//求长度
{
int n = 0;
linklist *p;
p = head;
if (head == NULL)
printf("表为空\n");
else
while (p != NULL)
{
n++;
p = p->next;
}
printf("\n该单链表的长度为:%d\n", n); // n + 1
}
linklist* GET(linklist* head, int i)//修改
{
int j;
linklist* p, * q;
q = p = head;
j = 0;
while (p && j < i) //修改
{
j++;
q = p;
p = p->next;
}
if (p != NULL ) //if (i == j)
return q;
else
return NULL;
}
int LOCATE(linklist* head, char key)// 修改
{
linklist* p;
int i = 0;
p = head; //p = head->next; 修改
while (p != NULL)
{
if (p->data == key) break;
i++;
p = p->next;
}
if (p != NULL)
return i + 1; //i-1;
else
return -1; // -1 表示未找到
}
linklist* INSERTBEFORE(linklist* head)//前插
{
linklist* s, * p=NULL;
int i;
char x;
printf("\n请输入插入的结点值:");
scanf("%c", &x);
getchar();
printf("请输入插入的位置:");
scanf("%d", &i);
getchar();
p = GET(head, i-1);
if (p == NULL)
{
printf("插入位置错误,无法插入!\n");
return head;
}
s = (linklist*)malloc(sizeof(linklist));
s->data = x;
if (p == head && i==1)
{
s->next = head;
head = s;
}
else {
s->next = p->next;
p->next = s;
}
printf("插入成功!\n");
return head;
}
linklist* DELETE(linklist* head, int i)
{
linklist* p, * r;
int j;
j = i - 1;
p = GET(head, j);
if (p == NULL)
{
printf("删除位置错误!\n");
return head;
}
if (p == head && i == 1)
{
r = head;
head = head->next;
}
else{
r = p->next;
p->next = r->next;
}
free(r);
printf("删除成功!\n");
return head;
}
int main()
{
linklist* head;
int j = 1, g = 1, h = 1;
int i = 1;
int n = 0;
char key;
head = CREATLISTRO();
ShowList(head);
printf("请输入须查找结点值:");
getchar(); //修改
scanf("%c", &key);
printf("值为: %c 结点储存的位置为:%d\n", key, LOCATE(head, key));
getchar();
LENGTH(head);
head = INSERTBEFORE(head);
ShowList(head);
printf("请输入删除的结点位置:\n");
scanf("%d", &i);
getchar();
head = DELETE(head, i);
ShowList(head);
return 0;
}
1.哪里有错,截主要部分
2.没有注释,很少有闲人给你看这么长的代码
1.先确认链表建的是否正确
2.如果链表建的没问题,你查找的位置是从0开始的还是从1开始的?