c语言链表的初始化,建立,插入,查找,删除!!急急急!谢谢各位大神了!

Python025

c语言链表的初始化,建立,插入,查找,删除!!急急急!谢谢各位大神了!,第1张

好吧,我居然找到了我以前的了。。。

#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 List

printf("输入创建链表的长度:")

scanf("%d",&num)

CreateList_H(List,num) //创建链表

改为 

LNode List

printf("输入创建链表的长度:")

scanf("%d",&num)

CreateList_H(&List,num) //创建链表

函数内在堆上分配好内存,但是 没有传递到栈上

另外 你的变量名很迷人