单链表的基本操作 c语言

单链表的基本操作 c语言

问题描述:

用C语言实现单链表的各种基本操作

typedef struct node
{
int n;
struct node next;
}Node;
Node *create();
void print(Node *head);
Node *sort(Node *head);
Node *swap(Node *head);
void main()
{
Node *head = create();
print(head);
// head = sort(head);
// print(head);
//head = swap(head);
//print(head);
}
Node *create()
{
Node *head=NULL,*p1=NULL,*p2=NULL;
p1 = (Node
)malloc(sizeof(Node));
p1->next = NULL;
while(1 == scanf("%d",&p1->n))
{
if(head == NULL)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
}
free(p1);
p1 = NULL;
return head;
}
void print(Node *head)
{
Node *p = head;
while(p != NULL)
{
printf("%d ",p->n);
p = p->next;
}
printf("\n");
}
Node *sort(Node *head)
{
Node *newhead=NULL,*newtail=NULL,*p,*min,*minf;
if(head == NULL || head->next == NULL)
return head;
while(head != NULL)
{
p = min = head;
for(;p->next != NULL;p = p->next)
{
if(p->next->n < min->n)
{
min = p->next;
minf = p;
}
}
//2
if(newhead==NULL)
{
newhead = newtail = min;
}
else
{
newtail->next = min;
newtail = min;
}
//3
if(min == head)
head = head->next;
else
minf->next = min->next;
}
if(newhead != NULL)
newtail->next = NULL;
return newhead;
}
Node *swap(Node *head)
{
Node *p = NULL,*pf = NULL,*pn = NULL;
if(head == NULL || head->next == NULL)
return head;
pf = head;
p = pf->next;
pf->next = NULL;
while(p->next != NULL)
{
pn = p->next;
p->next = pf;
pf = p;
p = pn;
}
p->next = pf;
head = p;
return head;
}

void test(Node *head)
{
Node *p1,*p2;
p1 = p2 = head;
while(p1 != NULL)
{
p1 = p1->next;
if(p1!=NULL)
{
p1 = p1->next;
p2 = p2->next;
}
}
}

#endif

typedef struct data
{
int n;
struct data next;
struct data *front;
}Node;
#if 0
Node *create()
{
Node *head=NULL,*p1=NULL,*p2=NULL;
p1 = (Node
)malloc(sizeof(Node));
p1->next = NULL;
while(1 == scanf("%d",&p1->n))
{
if(head == NULL)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
}
free(p1);
p1 = NULL;
p2->next = head;
return head;
}
void print(Node *head)
{
Node *p = head;
do
{
printf("%d ",p->n);
p = p->next;
}while(p != head);
printf("\n");
}
#endif

Node create()
{
Node *head=NULL,*p1=NULL,*p2=NULL;
p1 = (Node
)malloc(sizeof(Node));
p1->next = NULL;
p1->front = NULL;
while(1 == scanf("%d",&p1->n))
{
if(head == NULL)
head = p1;
else
{
p2->next = p1;
p1->front = p2;
}
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
p1->front = NULL;
}
free(p1);
p1 = NULL;
return head;
}
void print(Node *head)
{
Node *p = head,*p1 = NULL;
while(p != NULL)
{
p1= p;
printf("%d ",p->n);
p = p->next;
}
printf("\n");
while(p1 != NULL)
{
printf("%d ",p1->n);
p1 = p1->front;
}
printf("\n");
}
int main()
{
Node *head = create();
print(head);
return 0;
}
看不懂的话可以私我

 1、查找

  对单链表进行查找的思路为:对单链表的结点依次扫描,检测其数据域是否是我们所要查好的值,若是返回该结点的指针,否则返回null

  因为在单链表的链域中包含了后继结点的存储地址,所以当我们实现的时候,只要知道该单链表的头指针,即可依次对每个结点的数据域进行检测

  以下是应用查找算法的一个例子:

#include <stdio.h>
#include <malloc.h>
#include <string.h> /*包含一些字符串处理函数的头文件*/
#define n 10
typedef struct node
{
 char name[20];
 struct node *link;
}stud;

stud * creat(int n) /*建立链表的函数*/
{
 stud *p,*h,*s;
 int i;
 if((h=(stud *)malloc(sizeof(stud)))==null)
 {
  printf(\"不能分配内存空间!\");
  exit(0);
 }
 h->name[0]=\'\0\';
 h->link=null;
 p=h;
 for(i=0;i<n;i++)
 {
  if((s= (stud *) malloc(sizeof(stud)))==null)
  {
   printf(\"不能分配内存空间!\");
   exit(0);
  }
  p->link=s;
  printf(\"请输入第%d个人的姓名\",i+1);
  scanf(\"%s\",s->name);
  s->link=null;
  p=s;
 }
 return(h);
}

stud * search(stud h,char *x) /查找链表的函数,其中h指针是链表的表头指针,x指针是要查找的人的姓名*/
{
 stud p; /当前指针,指向要与所查找的姓名比较的结点*/
 char y; /保存结点数据域内姓名的指针*/
 p=h->link;
 while(p!=null)
 {
  y=p->name;
  if(strcmp(y,x)==0) /*把数据域里的姓名与所要查找的姓名比较,若相同则返回0,即条件成立*/
   return(p); /*返回与所要查找结点的地址*/
  else p=p->link;
 }
 if(p==null)
  printf(\"没有查找到该数据!\");
}

main()
{
 int number;
 char fullname[20];
 stud head,*searchpoint; /*head是表头指针,searchpoint是保存符合条件的结点地址的指针/
 number=n;
 head=creat(number);
 printf(\"请输入你要查找的人的姓名:\");
 scanf(\"%s\",fullname);
 searchpoint=search(head,fullname); /*调用查找函数,并把结果赋给searchpoint指针*/
}

#include
#include
//结构体
struct Node{

int data;

struct Node* next;
};
//创建链表
struct Node* createList(){
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); //headnode变成了结构体变量
headNode->next = NULL;
return headNode;
}
// 创建结点

struct Node* createNode(int data){
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next=NULL;
return newNode;

}
//打印
void printList(struct Node* headNode) {
struct Node* pMove=headNode->next;
while(pMove){
printf("%d",pMove->data);
pMove = pMove->next;
}
printf("\n");
}
//头部插入 插入结点 参数;插入那个结点,插入结点的数据是多少
void insertNodeByHead(struct Node* headNode,int data){
//创建插入的结点
struct Node* newNode = createNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
} //删除结点
void deleteNodeByAppoin(struct Node* headNode,int posData){
struct Node* posNode=headNode->next;
struct Node* posNodeFront = headNode;
if(posNode==NULL) //posNode指定位置
printf("链表为空\n"); //posNodeFront 指定位置前面

else{

 while(posNode->data!=posData){
    posNodeFront=posNode;
    posNode=posNodeFront->next;
     if(posNode==NULL){
        printf("没找到相关信息\n");
        return;
     } 

}
posNodeFront->next = posNode->next;
free(posNode);
}
}

int main(){
struct Node* list = createList();
insertNodeByHead(list,1);
insertNodeByHead(list,2);
insertNodeByHead(list,3);
printList(list);
deleteNodeByAppoin(list,2);
printList(list);
system("pause");
return 0;
}