#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define N 10
typedef struct node
{
char name[20]
struct node *link
}stud
stud * create(int n) //创建有n个节点的链表,返回链表头结点
{
stud *p,*h,*s
if((h=(stud *)malloc(sizeof(stud)))==NULL)//创建头节点
{
printf("Memory allocation fails!")
exit(0)
}
strcpy( h->name, “head” )
h->link=NULL
p=h
for(int i=0i<n-1i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)//依次创建每一个节点
{
printf("Memory allocation fails!")
exit(0)
}
p->link=s
printf("Please input %d person name:", i+1)
scanf("%s",s->name)
s->link=NULL
p=s
}
return(h)
}
stud* search(stud *h, char *x) //查找,h是链表头结点,x是要查的字符串
{
stud *p = h
while(p!=NULL) //最后一个节点的link
{
if(strcmp(p->name, x)==0)
return(p)
else
p=p->link//p指向下一个节点
}
if(p==NULL)
printf("There is no such a student!")
return p
}
stud* Delete(stud *h, char *x) //删除某个节点,返回链表头结点 //x是要删除的数据
{
if( h == NULL)
return NULL
stud * p1, *p2
p1=h
p2=h->link
if (strcmp( p1->name, x ) == 0 )//头结点特殊处理
{
h = h->link//头指针指向第二个元素即可
free(p1)//释放头结点
return h
}
while(p2!=NULL)//p2 代表当前要比较的节点,p1代表当前节点的前一个节点
{
if(strcmp(p2->name, x)==0)
{
p1->link = p2->link
free(p2)
return h
}
else
{
p1=p2
p2=p2->link//一起往后移
}
}
rerun h
}
void insert(stud *p) //在p节点后插入一个节点
{
char stuname[20]
stud *s
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("Memory allocation fails!")
exit(0)
}
printf("Please input name” )
scanf("%s",stuname)
strcpy(s->name,stuname)
s->link=p->link//后边连接
p->link=s//前边连接
}
void freeList(stud* head) //删除整个链表
{
stud* p
while( head != NULL)
{
p = head
head = head->link
free(p)
}
}
void printList(stud* head) //打印链表中的所有数据
{
stud* p
p = head
int count = 0
while(p != NULL)
{
printf("%s\n", p->name)
p = p->link
count++
}
}
int main()
{
int number
char fullname[20]
stud *head,*searchpoint
number=N
head=creat(number)
printf("Input the srearch name:")
scanf("%s",fullname)
searchpoint=search(head,fullname)
insert(searchpoint)
char str[10]
scanf( “%s”, str )
head = delete( head, str )
printList( head )
freeList( head )
return 0
}
以下是将链表逆置的demo
typedef struct linknode
{
int data
struct linknode *next
}node
//将一个链表逆置
typedef struct linknode
{
int data
struct linknode *next
}node//类型定义
node *reverse(node *head)
{
node *p,*q,*r//q代表当前节点,p代表当前节点的前一个节点,r代表当前节点的下一个节点
p=head
q=p->next
while(q!=NULL)
{
r=q->next
q->next=p
p=q
q=r
}
head->next=NULL
head=p
return head
}
主函数这里
Linklist Listprintf("输入创建链表的长度:")
scanf("%d",&num)
CreateList_H(List,num) //创建链表
改为
LNode List
printf("输入创建链表的长度:")
scanf("%d",&num)
CreateList_H(&List,num) //创建链表
函数内在堆上分配好内存,但是 没有传递到栈上
另外 你的变量名很迷人